簡體   English   中英

在搜索多維數組時返回true / false

[英]Return true/false on searching 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;
    }
}

任何人都可以做得更好,並且以更優雅的方式將其與關鍵和價值相匹配嗎?

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

(提示:您可能希望將其包裝到類中以防止映射中出現不一致)

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

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

你可以隨時把它變成:

return $search_value == $the_array;

如果它不超過這兩個級別,翻轉鍵/合並會讓生活變得更加愉快:

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


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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM