2016-04-11 15 views
1

多次元配列とforeachループに関する多くの質問があります。時間をかけて読んで、自分のループを成功させようと努力しました。解決策が重複している場合、私は自分の質問を削除します(または、それが望ましい場合は別のものへのリンク)。配列検索付き多次元配列ループ

今、挑戦:

  • 返さMYSQL結果の配列を使用します。結果は、連想配列の複数の結合テーブルからのものです。今私は必要な多次元配列に変換する必要があります。
  • 私はそのほとんどを動作させていますが、問題はループして新しい項目を配列の適切な場所に追加しています。

ここにいくつかのコードです:

//example of how array is setup in the way I want, this part works. 
foreach($results as $i => $a): 

    //some other code is here, see below. 

    $items[$i] = [ 
     "id" => $a['id'], 
     "itemid" => $a['itemid'], 
     "name" => $a['name'], 
     "def" => $a['def'], 
     "class" => $a['class'], 
     "timeline" => $a['timeline'], 
     "files" => [ 
      [0] => [ 
       "id" => $a['fileid'], 
       "name" => $a['filename'], 
       "path" => $a['filepath'], 
       "type" => $a['filetype'] 
      ] 
     ], 
     "tags" => [ 
      [0] => [ 
       "id" => $a['tagid'], 
       "name" => $a['tagname'] 
      ] 
     ] 
    ]; 
endforeach; 

それから私だけに順序をループにいくつかの方法を試した項目「idが」の場合、「タグ」または「ファイル」に追加最後と同じ。ここでは、現在のコードは、私のエディタである動作しない:

//inside foreach loop, before above code 
if($items[$i-1]['id'] == $a['id']): 
    //it is the same item, works to here. 
    if(in_array($a['filename'], $items[$i-1], FALSE)): 
     //add to files array for last item 
     $items[$i-1]['files'][] = [ 
      "id" => $a['fileid'], 
      "name" => $a['filename'], 
      "path" => $a['filepath'], 
      "type" => $a['filetype'] 
     ]; 
    elseif(in_array($a['tagname'], $items[$i-1], FALSE)): 
     //add to tags array for last item 
     $items[$i-1]['tags'][] = [ 
      "id" => $a['tagid'], 
      "name" => $a['tagname'] 
     ]; 
    endif; 
else:// else it does the code above 

あなたが見ることができるように、私の最も最近の試みは、私は今、多次元配列では動作しません実現した、in_array使用することでした。私の問題は、同じファイルの新しいファイルか新しいタグかどうかを判断する方法を見つけることができないということです。

最終的に、複数の「ファイル」と「タグ」を持つ「アイテム」の配列が必要です。私はjson_encodeに行きJSの後でそれを使うつもりです。

これを取得したり最適化する方法についてアドバイスをいただければ幸いです。

P.S.前にも述べたように、私はこの問題が以前に尋ねられていることは知っていますが、私のソリューションは私のために働くことができませんでした。ソリューションが重複している場合は、この質問を削除します(他の人にはあまり役に立ちません)。何か助けてくれてありがとう、それは非常に感謝しています!

+0

お使いのPHPのバージョンは何ですか? PHP> = 5.5では、 '' array_column'(http://php.net/manual/en/function.array-column.php)を使用することができます: 'in_array($ a ['filename']、array_column($ items [$ i-1] ['files']、 'name')) ' – fusion3k

+0

チップ@fusion3kをありがとう。私はその機能に関するドキュメントを読んで、試してみるつもりです。 – turnfire

答えて

0

"autoincrementing"配列インデックスは使いにくいので使いません。あなたの結果が返さ可能性がある場合

if (isset($items[$a['id']])) { 
    // We had this id before, just add files/tags to it. 
    // Check first, if files subarray exists, if not: create it. 
    if (!isset($items[$a['id']]['files'])) { 
    $items[$a['id']]['files'] = array(); 
    } 
    $items[$a['id']]['files'][] = array(...); // add the new file. 
    // Repeat for tags. 
} 

//example of how array is setup in the way I want, this part works. 
foreach($results as $i => $a): 
$items[$a['id']] = [ // THIS CHANGED. 
    "id" => $a['id'], 
    "itemid" => $a['itemid'], 
    ... 

を今すぐidがあなたの配列にすでにある場合、更なる結果と、あなたは簡単に、確認することができ、:それはすでにありますので、ご使用のデータベースIDを使用します同じファイルを複数回IDよりも、あなたは、ファイル名は、検索機能を使って、そこにすでに存在するかどうかを確認することができます

$filename = $a['filename']; 
if (!searchFilename($filename, $items[$a['id']]['files']) { 
    // Filename is not in there, yet. 
    // Add file info. 
} 

function searchFilename($id, $array) { 
    foreach ($array as $key => $val) { 
    if ($val['filename'] === $id) { 
     return true; 
    } 
    } 
    return false; 
} 

同じことが、同様の方法で、タグに適用されます。最後に

、あなたが$itemsのインデックスのidをしたくない場合は、単に呼び出す:

$items = array_values($items); 
+0

インデックスを使ってどこに間違っていたのか分かりました。追加のファイル/タグが2つ以上ある場合、配列内の間違ったインデックスを探しています。 ご説明いただきありがとうございます。私はあなたのソリューションが私のために働くだろうと確信しています。 P (PSはこの質問を削除するか、そのままにしておくべきですか?その瑕疵は論理にあります= Pコメントはコメントとして残してください) – turnfire

+0

正確には、なぜなら、 '$ i [' id '] 'が前に処理されたかどうかにかかわらず、' $ i'はインクリメントされるからです。 – Paul

+0

私はいくつかの変更を行いましたが、あなたの解決策は必要なものでした。ファイル/タグIDをインデックスとして、配列の設定方法を完全に変更しました。もう一度おねがいしますポール、ロック! – turnfire