2011-07-16 33 views
1

我一直在試圖編寫一個PHP函數,它在數組中搜索id索引中的vale,並且一旦找到,返回導致它發現的路徑。PHP函數返回數組索引路徑

看看下面的數組:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [data] => Array 
       (
        [0] => Array 
         (
          [id] => 8 
         ) 

        [1] => Array 
         (
          [id] => 9 
         ) 

        [2] => Array 
         (
          [id] => 10 
          [data] => Array 
           (
            [0] => Array 
             (
              [id] => 15 
              [data] => Array 
               (
                [0] => Array 
                 (
                  [id] => 22 
                 ) 

               ) 

             ) 

            [1] => Array 
             (
              [id] => 21 
             ) 

           ) 

         ) 

       ) 

     ) 

) 

如果尋找[id] => 21它會返回array(1,10)。然而,我曾多次嘗試失敗。設置的路徑應設置爲索引id。但是,我無法弄清楚。任何指導的話都非常感謝。

回答

2

該函數返回數組(1,10)爲OP例如

(會留下,其他的答案,以防萬一有人會看FO r正常的「路徑搜索」)

function search_data($needle, $haystack) { 
    if (is_array($haystack)) { 
     foreach($haystack as $data) { 
      if ($data['id'] == $needle) return array(); 
      if (isset($data['data'])) { 
       if (($path = search_data($needle, $data['data'])) !== false) return array_merge(array($data['id']), $path); 
      } 
     } 
    } 
    return false;  
} 
+0

它的工作原理!我幾秒前就解決了這個問題,但是你只是一個例子,用更少的代碼就可以快得多。謝謝。 :3 – escproxy

1

此功能OP示例返回陣列(0, '數據',2, '數據',1, 'ID')(即完整路徑值)

功能其搜索$key => $value一對在數組,並返回路徑:

function array_search_r($key, $value, $haystack, $strict = null) { 
    $strict = $strict ?: false; 
    if (is_array($haystack)) { 
     foreach($haystack as $k => $v) { 
      if ($strict ? ($k === $key && $v === $value) : ($k == $key && $v == $value)) return array($k); 
      if(($path = array_search_r($key, $value, $v, $strict)) !== false) return array_merge(array($k), $path); 
     } 
    } 
    return false; 
} 
+0

它返回'array(1,10)',因爲父數組的id設置爲前1和後10.我將測試你的函數,謝謝。 – escproxy

+0

好吧,我現在看到你的意思,看到我的其他答案。 – lxa