2017-06-14 166 views
0

我想搜索數組的數組,如果發現了針,我想返回或至少知道匹配的鍵。PHP多維數組搜索返回鍵

例如,給定:

['foo'] => 
    ['bar'] => 'blah' 

搜索「等等」我需要知道有一個匹配,並且鍵是「」和「酒吧

我設法執行搜索,返回匹配的布爾值:

function search_array($needle, $haystack) { 
     if(in_array($needle, $haystack)) { 
      return true; 
     } 
     foreach($haystack as $element) { 
      var_dump($element); 
      if(is_array($element) && $this->search_array($needle, $element)) 
       return true; 
     } 
     return false; 
} 

但我正在努力如何知道鑰匙。這甚至有可能嗎?

回答

2

是的,這是可能的。一種解決方案是:

  • 在基本情況下,使用array_search()來獲得密鑰。
  • 在遞歸的情況下,當迭代遍歷haystack中的每個元素(遞歸之前)時,使用的$key => $value語法。然後,當遞歸調用產生一個值時,檢查返回的值是否是一個數組(如果是,使用array_unshift()將當前鍵推送到返回的數組上。否則,返回一個包含鍵和返回值的數組。

    function search_array($needle, $haystack) { 
        if(in_array($needle, $haystack)) { 
         return array_search($needle, $haystack); 
        } 
        foreach($haystack as $key => $element) { 
         if(is_array($element) && search_array($needle, $element)) { 
          $searchReturn = search_array($needle, $element); 
          if (is_array($searchReturn)) { 
           array_unshift($searchReturn, $key); 
           return $searchReturn; 
          } 
          return [$key, $searchReturn]; 
         } 
        } 
        return false; 
    } 
    

看到它在this playground example證明。

+0

感謝那些工作雖然我不得不修改第3行返回在我的情況給in_array。 –

1

你可以這樣做,因爲它是二維數組。

function search_array($needle, $haystack) { 
    foreach($haystack as $key => $value) { 
     if ($value == $needle) { 
      return array($key); 
     } else if (is_array($value)) { 
      foreach ($value as $k => $v) { 
       if ($v == $needle) { 
        return array($key, $k); 
       } 
      } 
     } 
    } 
} 

對於你應該使用一個遞歸函數的n維數組...

+0

這是一個有趣的非遞歸解決方案,thnaks –