2012-04-30 10 views
0

でそのパスを取得:多次元配列の値を検索し、これは私の配列でPHP

$array = array (
'1' => array(
    'title' => 'Level1', 
    'nodes' => array(
    '11' => array('title' => 'sub1_company1'), 
    '12' => array('title' => 'sub2_company1'), 
    '13' => array(
    'title' => 'sub3_company1', 
    'nodes' => array(
     '131' => array('title' => 'item1_sub3_company1'), 
     '132' => array('title' => 'item2_sub3_company1'), 
    ), 
    ), 
), 
), 

'2' => array(
    'title' => 'Level2', 
    'nodes' => array(
    '21' => array('title' => 'sub1_company2'), 
    '22' => array('title' => 'sub2_company2'), 
), 
), 

'3' => array(
    'title' => 'Level3', 
    'nodes' => array(
    '31' => array('title' => 'sub1_company3'), 
    '32' => array(
    'title' => 'sub2_company3', 
    'nodes' => array(
     '321' => array('title' => 'item1_sub2_company3'), 
     '322' => array(
      'title' => 'item2_sub2_company3', 
      'nodes' => array(
      '3221' => array('title' => 'item1_sub3_company3'), 
     ), 
     ), 
    ), 
    ), 
), 
), 
'4' => array('title' => 'Level4'),); 

私は必要なものはsub2_company1を見つけて、ブレッドクラムなどのタイトルを取得することです。

レベル1> sub2_company1

または私はitem1_sub3_company1を検索すると、私はなります

レベル1> sub3_company1> item1_sub3_company1

私がこれまでにやったが、動作していないもの:

function breadcrumb($array, $needle) { 
    $path = array(); 

    $array_iterator = new recursiveArrayIterator($array); 
    $it = new recursiveIteratorIterator($array_iterator, RecursiveIteratorIterator::SELF_FIRST); 

    foreach($it as $key => $value) 
    { 
    echo "$key: $value <br>"; 
    if (!is_array($value)) { 
     array_push($path, $value); 
    } 
    if ($value === $needle) { 
     break; 
    } 
    } 

    //$content = '<div id="breadcrumb">' . implode('&nbsp;&#62;&nbsp;', $path) . '</div>'; 

    return print_r($path, 1); 
} 

ありがとう

答えて

1

あなたは再帰が必要です反復関数ではなく、ive関数です。

function breadcrumb($tree, $needle, &$result = array()) { 

    $result = array(); 

    if (is_array($tree)) { 
     foreach ($tree as $node) { 
      if ($node['title'] == $needle) { 
       $result[] = $node['title']; 
       echo '1-'; 
       return true; 
      } else if (!empty($node['nodes'])) { 
       if (breadcrumb($node['nodes'], $needle, $result)){ 
       echo '2-'; 
       $result[] = $node['title']; 
       return true; 
       } 
      } 
     } 
    } else { 
     if ($tree == $needle) { 
      echo '3-'; 
      $result[] = $tree; 
      return true; 
     } 
    } 
    return false; 
} 

breadcrumb($array, 'item1_sub3_company3', $result); 

print_r($result); 

パンくずリストが反転しているが、あなたの代わりにプッシュのarray_shift使用することができ、あなたがそれを正しい方法を持っているでしょう...