2017-03-19 16 views
-1

foreachループがいつ終了してHTMLタグを閉じることができるかを調べようとしています。この質問をもう少し簡潔に改訂しています。私は今、データセットを配列として関数に渡し、より簡単にできるようにしたいと考えています。私はフィールドのいずれかが、foreachを通過するたびにうまくいかなかった最大値に当たったかどうかを判断する必要があります。それは次のパスまで最大であると思っています。それはをループとしてForeachループ内で最高の要素を取得する

Array 
(
    [0] => 3391 
    [ID] => 3391 
    [1] => 2 
    [SubID] => 2 
    [2] => 2 
    [ListType] => 2 
    [3] => 0 
    [IndentText] => 0 
    [4] => 3 
    [BaseGroup] => 3 
    [4] => 1 
    [Quantity] => 1 
) 

がどのように私は最高のサブID値を取得することができます

データセット配列は次のようになりますか?私はこのような関数の行に沿って考えていますが、各行で実行されたときに最高の値を得る方法を考えることはできません。

function getMax($index, $array) { 
    $array = array($array[$index]); 
    return max($array); 
} 

私は$ MAXID = getMax(「SUBID」、$配列)として、これを実行すると期待が、その後、実際にはどんな意味のある結果を与えるようにする方法を考え出したが、それは動作します一度していません:

if ($maxID == $row['SubID']) : 
    // CLOSING HTML HERE 
endif; 

...は、最後の行にあり、タグを閉じることができることをコードに伝えます。何か案は?

ここには機能全体がありますが、本当に質問は直接関連していないので、それが役立つかどうかはわかりません。

function Notes($rowEntry) { 
    // Create variables 
    $ListType = (isset($rowEntry['ListType'])) ? $rowEntry['ListType'] : ""; 
    /* $ID = (isset($rowEntry['ID'])) ? $rowEntry['ID'] : ""; */ 
    $SubID = (isset($rowEntry['SubID'])) ? $rowEntry['SubID'] : ""; 
    $GroupNo = (isset($rowEntry['GroupNo'])) ? $rowEntry['GroupNo'] : ""; 
    $Title = (isset($rowEntry['Title'])) ? $rowEntry['Title'] : ""; 
    $SubPartNo = (isset($rowEntry['SubPartNo'])) ? $rowEntry['SubPartNo'] : ""; 
    $SubDescription = (isset($rowEntry['SubDescription'])) ? LinkAbbvr($rowEntry['SubDescription']) : " "; 
    $SubPage = (isset($rowEntry['SubPage'])) ? $rowEntry['SubPage'] : ""; 
    // SubQuantity field is integer so, to match original hardcopy, 0 used in place of X 
    // Condition below changes it back to X for display 
    $SubQuantity = (isset($rowEntry['SubQuantity'])) ? $rowEntry['SubQuantity'] : ""; 
    $SubQuantity = ($SubQuantity == 0) ? "X" : $SubQuantity; 
    // Create Edit link to SubQuantity value 
    $EditSubQuantity = (isset($_SESSION['AccessLevel']) && $_SESSION['AccessLevel'] == 3) 
          ? "<a href=\"/administration/adminforms.php?FormID=33&ID=$SubID\">$SubQuantity</a>" 
          : $SubQuantity; 

    // For note of a specific group by itself, ie Group 3.5890 page 98 
    // Uses style .groupcaption 
    if ($ListType == 1) : 
     if ($GroupNo && $Title) : 
      $last_groupnote = ""; 
      if ($Title && $GroupNo != $last_groupnote) : 
       $last_groupnote = $GroupNo; 

       $NotesText = "<div class=\"groupcaption\">\n"; 
        $NotesText .= "<div class=\"SubTitle\">$Title</div>\n"; 
       $NotesText .= "</div>\n\n"; 

      echo $NotesText; 
      endif; 
     endif; 

    // For indented sub-listings, ie Group 3.639 page 108 
    // This lists Quantity, PartNo and Description 
    // Uses style #css-subtable 
    elseif ($ListType == 2) : 
     global $TitleCaption; 
     $NotesText = ""; 
     // Show Title column only once 
     if ($Title != $TitleCaption) : 
      $TitleCaption = $Title; 
      // Close part listing row table 
      $NotesText .= "</div>\n\n"; 
      // Open subtable and title 
      $NotesText .= "<div id=\"css-subtable\">\n"; 
      $NotesText .= "<div class=\"RowCaption\">$Title</div>\n\n"; 
     endif; 

     if ($SubDescription && !is_null($SubDescription)) : 
      $NotesText .= "<div class=\"row\">\n"; 
       $NotesText .= "<div class=\"col\">$EditSubQuantity</div>\n"; 
       $NotesText .= "<div class=\"col\">$SubPartNo</div>\n"; 
       $NotesText .= "<div class=\"col\">$SubDescription</div>\n"; 
      $NotesText .= "</div>\n\n"; 
     endif; 

     $subMax = getMax("SubID", $rowEntry); 

     // Check to see if last row 
     if ($SubID == $subMax) : 
     //if ($SubID == 15) : 
      // Close the subtable 
      $NotesText .= "</div>\n\n"; 
      // Restart row table 
      if ($ListType < 5) : 
       $NotesText .= "<div id=\"css-table\">\n"; 
      elseif ($ListType > 4) : 
       $NotesText .= "<div id=\"css-sublist$ListType\">\n"; 
      endif; 
     endif; 

     echo $NotesText; 

    // For indented sub-listings description-only list, ie Group 1.322 page 16 
    // This lists Description only 
    // Uses style #css-subsingletable 
    elseif ($ListType == 3) : 
     global $rowCount; 
     $NotesText = ""; 

     $rowCount++; 
     // Clost main style, open new one 
     if ($rowCount == 1) : 
      // Close part listing row table 
      $NotesText .= "</div>\n\n"; 
      // Open subtable and title 
      $NotesText .= "<div id=\"css-subsingletable\">\n"; 
     endif; 

     if ($SubDescription && !is_null($SubDescription)) : 
      $rowCount++; 
      $NotesText .= "<div class=\"row\">\n"; 
       $NotesText .= "<div class=\"col\">$SubDescription</div>\n"; 
      $NotesText .= "</div>\n\n"; 
     endif; 

     if ($rowCount == 3) : 
      $NotesText .= "</div>\n\n"; 
      // Restart row table 
      if ($ListType < 5) : 
       $NotesText .= "<div id=\"css-table\">\n"; 
      elseif ($ListType > 4) : 
       $NotesText .= "<div id=\"css-sublist$ListType\">\n"; 
      endif; 
     endif; 
     echo $NotesText; 

    // For single notes, ie Group 1.607 page 29 
    // Uses style #css-partnotes 
    elseif ($ListType == 4) : 
     $TitleCaption = ""; 

     if ($Title) : 
      if ($Title != $TitleCaption) : 
       $TitleCaption = $Title; 
       // Close part listing row table 
       $NotesText = "</div>\n\n"; 
        $NotesText .= "<div id=\"css-partnotes\">\n"; 
         $NotesText .= "<div class=\"row\">\n"; 
          $NotesText .= "<div class=\"col\">\n"; 
           $NotesText .= "<div class=\"RowCaption\">$Title</div>\n"; 
          $NotesText .= "</div>\n"; 
         $NotesText .= "</div>\n"; 
        $NotesText .= "</div>\n\n"; 
       // Restart row table 
       if ($ListType < 5) : 
        $NotesText .= "<div id=\"css-table\">\n"; 
       elseif ($ListType > 4) : 
        $NotesText .= "<div id=\"css-sublist$ListType\">\n"; 
       endif; 
       echo $NotesText; 
      endif; 
     endif; 
    endif; 
} 

上記の関数から呼び出されている:最高SubIDを見つけるには

// This function used to simplify partsbook.php and partsbookdetails.php 
// IN CONJUNCTION WITH ABOVE, FUNCTION PARTIALLY REPLACES OBSOLETE PartID() 
function PartsList($sqlView) { 
    $rowView = DBConnect($sqlView, "Multiple", "pchome_packardsimperials"); 
    if ($rowView) : 
     $last_groupno = ""; 
     $last_id = ""; 
     $rowNumber = 0; 
     foreach ($rowView as $row) : 
      $rowNumber++; 
      $ID = (isset($row['ID'])) ? $row['ID'] : ""; 
      $ListType = (isset($row['ListType'])) ? $row['ListType'] : ""; 
      $BaseGroup = (isset($row['BaseGroup'])) ? $row['BaseGroup'] : 0; 
      $GroupNo = (isset($row['GroupNo'])) ? $row['GroupNo'] : ""; 
      $GroupName = (isset($row['GroupName'])) ? LinkAbbvr($row['GroupName']) : ""; 
      $Name = (isset($row['Name'])) ? LinkAbbvr($row['Name']) : ""; 
      $Title = (isset($row['Title'])) ? $row['Title'] : ""; 
      $PartNo = (isset($row['PartNo'])) ? $row['PartNo'] : ""; 

      $Models = (isset($row['Models'])) ? $row['Models'] : ""; 
      $Description = (isset($row['Description'])) ? LinkAbbvr($row['Description']) : "&nbsp;"; 
      $PageNo = (isset($row['PageNo'])) ? $row['PageNo'] : ""; 
      $SubPage = (isset($row['SubPage'])) ? $row['SubPage'] : ""; 
      $RevDate = (isset($row['RevDate'])) ? $row['RevDate'] : ""; 
      $Edition = (isset($row['Edition'])) ? $row['Edition'] : ""; 

      // Choose variable for use in title of GroupNo() function 
      if ($ListType < 5) : 
       $ListName = $Name; 
      elseif ($ListType > 4) : 
       $ListName = $Title; 
      endif; 

      // Check to see if GroupNo is different than previous one 
      if ($GroupNo != $last_groupno || $rowNumber == 1) : 
       $last_groupno = $GroupNo; 
       $NewGroup = TRUE; 
      else : 
       $NewGroup = FALSE; 
      endif; 

      // Show GroupNo() captions only once per group 
      if ($NewGroup === TRUE) : 
       GroupNo($GroupNo, $NewGroup, $ListName, $rowNumber, $ListType); 
      endif; 

      if ($ListType < 5) : 
       // To prevent duplicates, check to see if ID is different than previous one before displaying 
       if ($ID != $last_id) : 
        $last_id = $ID; 
        PartRow($row); 
       endif; 
       Notes($row); 
      elseif ($ListType > 4) : 
       SpecialRow($row); 
      endif; 

     endforeach; 
    endif; 
} 
+0

あなたのデータに「SubID」が1つだけある場合、「SubID」の最大の価値を得る目的は何ですか? – trincot

+0

データセットの最大可能SubIDがわかったら、foreachループ内の行ごとに提示されているSubIDと比較して、データセットの最後にあることを知ることができます。 – DonP

+0

具体的な質問に答えることができます。コードを投稿すると、より効率的なアプローチが可能です。 – fubar

答えて

0

は、次のように使用することができます。

$max = max(array_map(function ($row) { 
    return $row['SubID']; 
}, $data)); 

編集:まだ以上:

$max = array_reduce($data, function ($max, $row) { 
    return $row['SubID'] > $max ? $row['SubID'] : $max; 
}, 0); 

メインのforeachループの外側でこれを1回使用して、結果の値を比較に使用します。

さらにコードを投稿すれば、より効率的なアプローチをお勧めします。

+0

明確にするために、私は主な問題であるforeachループの外側には何もできません。このコードは、大規模なデータセットのforeachループを含む別の関数から呼び出されている関数内にあります。その一部は、私が処理している関数に向けられています。そのため、各パススルーには次のパスまで最大である単一のコードが含まれているため、$ maxID値を取得する方法を見つけることができません。私は比較する方法を見つける助けが必要です、そして、最後のパスで最大値を与えるだけです。 – DonP

+0

ここに全体の機能がありますが、私が提供するスニペット以上のことを教えてくれるのではないかと思います。申し訳ありませんが、私は試みましたが、機能が長すぎて、本当に助けにならない他の部分が含まれています。 – DonP

+0

新しいコードはどこですか?コレクション全体にアクセスできない場合は、指摘したように、最大​​IDが何であるかを確認することはできません。 – fubar

0

皆様、お手伝いをしていただきありがとうございます。 不可能は頻繁に使用する言葉ではありませんが、この場合は私がやりたいことにも当てはまると思います。いったん私がそれに同意したら、そのトリックを行うような回避策を見つけましたが、これまでに決して起こったことのないサブクエリを使ってクエリを実行しました。ここでは、単にparts_notesテーブルが持つ可能性のある最も高い値を与えるクエリの部分を示します。関数内の条件は、受け取っている行のSubIDと比較し、一致したときにタグを閉じます。それは今のところうまくいくようです。

SELECT DISTINCT 
pl.ID, 
pn.ID AS SubID, 

IF(ListType,(SELECT MAX(ID) 
FROM parts_notes 
WHERE PageNo=108 
AND ListType IS NOT NULL 
AND SubPage IS NULL),NULL) AS SubMax, 

ListType, 
IndentText, . . . 
関連する問題