2012-02-08 13 views
1

を私のように、以下の配列構造を印刷する必要があります:どのように私は、foreachのを使用して行うことができforeachのが動作しない - PHP

Node Title 1 

    topic 1 

    topic 2 

    topic 3 

    topic 4 

    asset title1 

    asset title2 

    asset title3 

- 私がやっていることPHP

は次のとおりです。

foreach($output['fields'] as $key => $value) { 
     if($key == 'title') { 
      echo $value; 
     } 
     if(count($value['main_topic'])) { 
      foreach($value['main_topic'] AS $mainkey => $main_topic) { 
       echo $main_topic['topic_title']; 
      } 
     } 
    } 

上記の構文は、タイトルを印刷しています。しかし、main_topic配列ではありません。

Array 
(
    [fields] => Array 
     (
      [nid] => 136 
      [node_title] => Node title 1 
      [node_type] => curriculum 
      [title] => Node title 1 
      [main_topic] => Array 
       (
        [0] => Array 
         (
          [row_id] => 136 
          [topic_id] => 411847 
          [weight] => 10 
          [topic_title] => topic 1 
         ) 

        [1] => Array 
         (
          [row_id] => 136 
          [topic_id] => 411839 
          [weight] => 2 
          [topic_title] => topic 2 
         ) 

        [2] => Array 
         (
          [row_id] => 136 
          [topic_id] => 411840 
          [weight] => 3 
          [topic_title] => topic 3 
         ) 

        [3] => Array 
         (
          [row_id] => 136 
          [topic_id] => 411841 
          [weight] => 4 
          [topic_title] => topic 4 
          [subfield] => Array 
           (
            [1] => Array 
             (
              [asset_title] => asset title 1 
             ) 

            [2] => Array 
             (
              [asset_title] => asset title 2 
             ) 

            [3] => Array 
             (
              [asset_title] => asset title 3 
             ) 

           ) 

         ) 


       ) 

     ) 

) 

答えて

3

あなたはすべての$output['fields']上itearingされているためです。 'main_topic'のキーは$output['fields']の配列に含まれているため、foreachには$keyという名前しか存在しないため、'main_topic'というキーを持つ$valueはありません。以下、

foreach($output['fields'] as $key => $value) { 
     if($key == 'title') { 
      echo $value; 
      continue; 
     } 
     if($key == 'main_topic' && is_array($value)) { 
      foreach($value as $main_topic) { 
       echo $main_topic['topic_title']; 
      } 
     } 
    } 

は(資産のタイトルを含む)完全な解決策でこの答えを完了するために私はそれを書くだろうかです:あなたが望む配列が$value

あなたのコードは次のようであるべきです。

$output['fields']が出発点であり、コードをより読みやすくするために、=&演算子を使用して開始ノードへの参照を作成し、配列がメモリにコピーされないようにします。私は内側のforeachと同じことをします。

if (is_array($output['fields'])) { 
    $node =& $output['fields']; 
    echo $node['title']; 
    if(is_array($node['main_topic'])) { 
     foreach($node['main_topic'] as &$main) { 
      echo $main['topic_title']; 
      if(is_array($main['subfield'])) { 
       foreach($main['subfield'] as &$asset) { 
        echo $asset['asset_title']; 
       } 
      } 
     } 
    } 
} 
else { 
    echo "no menu"; 
} 
+0

'foreach($ value ['main_topic']'が間違っています – fire

+0

はい、私はちょうど私が最初の間違いの直後にコードを修正するのをやめたことに気付きました。 – Kaii

+0

私は正確に何が必要なのですか? – Fero

0

これを試してみてください、あなたは追加のキーが必要です。

echo $value['main_topic'][$mainkey]['topic_title']; 
+0

の$ main_topicを繰り返すオブジェクトです。キーを指定する必要はありません。 –

+0

@ sgermain06:右は速すぎました;) – djot

1

$valueが配列ではなく、$key['main_topic']

foreach($output['fields'] as $key => $value) { 
    if($key == 'title') { 
     echo $value; 
    } 
    if($key == 'main_topic') { 
     foreach($value as $mainkey => $main_topic) { 
      echo $main_topic['topic_title']; 
     } 
    } 
} 
0

あなたの配列部分が混乱しているです:私たちはデータを変更していないので、変数を参照するだけで十分ですし、少ないメモリとCPUを消費します。

てみてください(と私はこれをテストしていません):

echo $output['node_title']."\n"; 
foreach ($output['fields'] as $key=>$value) 
{ 
    switch ($key) 
    { 
     case 'title': 
      echo $value."\n"; 
      break; 
     case 'main_topic': 
      if (count($value) > 0) 
      { 
       foreach ($value as $main_block) 
       { 
        echo "\t".$main_block['topic_title']."\n"; 
        if (array_key_exists('subfield',$main_block)!==FALSE) 
        { 
         foreach ($main_block['subfield'] as $subfield_block) 
         { 
          echo "\t\t".$subfield_block['asset_title']."\n"; 
         } 
        } 
       } 
      } 
      break; 
     default: 
      break; 
    } 
}