2010-11-05 45 views
0

我有以下多維$數組:返回真/假的搜索多維數組

Array 
(
    [0] => Array 
     (
      [domain] => example.tld 
      [type] => 2 
     ) 

    [1] => Array 
     (
      [domain] => other.tld 
      [type] => 2 
     ) 

    [2] => Array 
     (
      [domain] => blaah.tld 
      [type] => 2 
     ) 

) 

我只是想遞歸搜索兩個鍵和值所有的陣列,並返回true,如果該鍵/值如果沒有發現,發現或者錯誤。

預期輸出:

search_multi_array($array, 'domain', 'other.tld'); // Will return true 
search_multi_array($array, 'type', 'other.tld'); // Will return false 
search_multi_array($array, 'domain', 'google.com'); // Will return false 

我已經想通了一個醜陋的,醜陋的搜索方法,反對對使用此功能的所有鍵域:

function search_multi_array($search_value, $the_array) { 
    if (is_array($the_array)) { 
     foreach ($the_array as $key => $value) { 
     $result = search_multi_array($search_value, $value); 
     if (is_array($result)) { 
      return true; 
     } elseif ($result == true) { 
      $return[] = $key; 
      return $return; 
     } 
     } 
     return false; 
    } else { 
     if ($search_value == $the_array) { 
     return true; 
     } 
     else 
     return false; 
    } 
} 

任何人都可以做的更好,同時匹配以更優雅的方式對抗關鍵和價值?

回答

1

如果沒有超越日OSE 2級,翻轉鍵/合併使生活更愉快:

<?php 
$data = array 
(
    '0' => array 
     (
      'domain' => 'example.tld', 
      'type' => 2 
     ), 

    '1' => array 
     (
      'domain' => 'other.tld', 
      'type' => 2, 
     ), 

    '2' => array 
     (
      'domain' => 'blaah.tld', 
      'type' => 2 
     ) 
); 
$altered = call_user_func_array('array_merge_recursive',$data); 
var_dump($altered); 
var_dump(in_array('other.tld',$altered['domain'])); 
var_dump(in_array('other.tld',$altered['type'])); 
var_dump(in_array('google.com',$altered['domain'])); 

要超越第2級,我們不得不一次循環遍歷所有的節點:

$option2 = array(); 
foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($data)) as $key => $value){ 
     $option2[$key][] = $value; 
} 
var_dump($option2); 
+0

這正是我正在做的事情。小心解釋爲什麼這不會超過2個級別? – 2010-11-05 02:02:17

+0

謝謝Wrikken,感謝它! – 2010-11-05 02:17:05

1

一種方法是從[domain] => [indices]和[type] => [indices]創建反向映射。除非您進行大量搜索,否則可能無法爲您節省很多。

(提示:你可能想將它包裝成一個類,以防止在映射不一致)

還,任何時候你看到這樣的事情:

if ($search_value == $the_array) { 
    return true; 
} else { 
    return false; 
} 

你可以隨時把它變成:

return $search_value == $the_array; 
+0

+1返回/分配布爾值的簡短表示法。 – 2010-11-05 01:39:39

0

 
function search_mutli_array($SearchKey, $SearchValue, $Haystack) 
{ 
    $Result = false; 
    if (is_array($Haystack)) 
    { 
     foreach ($Haystack as $Key => $Value) 
     { 
      if (is_array($Value)) 
      { 
       if (search_mutli_array($SearchKey, $SearchValue, $Value)) 
       { 
        $Result = true; 
        break; 
       } 
      } 
      else if ($SearchKey == $Key && $SearchValue == $Value) 
      { 
       $Result = true; 
       break; 
      } 
     } 
    } 
    return $Result; 
}