2010-11-05 46 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; 
}