在搜索多维数组时返回true / false

时间:2010-11-05 01:21:08

标签: php arrays multidimensional-array

我有以下多维$数组:

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

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

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

)

我只想递归搜索键和值上的所有数组,如果找到键/值则返回true,如果没有找到则返回false。

预期产出:

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;
    }
}

任何人都可以做得更好,并以更优雅的方式与关键和价值相匹配吗?

3 个答案:

答案 0 :(得分:1)

一种方法是从[domain] =>创建反向映射。 [indices]和[type] => [指数]。除非你进行大量搜索,否则它可能不会为你节省太多。

(提示:您可能希望将其包装到类中以防止映射中出现不一致)

此外,只要您看到类似的内容:

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

你总是可以把它变成:

return $search_value == $the_array;

答案 1 :(得分:1)

如果它不超过这两个级别,翻转键/合并会让生活变得更加愉快:

<?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']));

要超越第二级,我们必须遍历所有节点:

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

答案 2 :(得分: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;
}