检查多维数组中是否存在特定的数组键 - PHP

Dar*_*ney 20 php arrays multidimensional-array

我有一个多维数组,例如(这可能是很多级别):

$array = Array ( 
    [21] => Array ( ) 
    [24] => Array ( 
        [22] => Array ( ) 
        [25] => Array ( 
            [26] => Array ( ) 
        ) 
    ) 
) 
Run Code Online (Sandbox Code Playgroud)

我试图循环它,看看是否存在某个键:

$keySearch = 22; // key searching for

function findKey($array, $keySearch) {
    foreach ($array as $item){
        if (isset($item[$keySearch]) && false === findKey($item[$keySearch], $item)){
            echo 'yes, it exists';
        }
    }
}

findKey($array, $keySearch);
Run Code Online (Sandbox Code Playgroud)

但它一无所获.循环中是否有错误?

Tim*_*Tim 41

array_key_exists()有帮助的.

然后这样的事情:

function multiKeyExists(array $arr, $key) {

    // is in base array?
    if (array_key_exists($key, $arr)) {
        return true;
    }

    // check arrays contained in this array
    foreach ($arr as $element) {
        if (is_array($element)) {
            if (multiKeyExists($element, $key)) {
                return true;
            }
        }

    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

工作示例:http://codepad.org/GU0qG5su


Ale*_*era 33

我玩了你的代码让它工作:

function findKey($array, $keySearch)
{
    foreach ($array as $key => $item) {
        if ($key == $keySearch) {
            echo 'yes, it exists';
            return true;
        } elseif (is_array($item) && findKey($item, $keySearch)) {
            return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)


kno*_*t22 10

这是一个单行解决方案:

echo strpos(json_encode($array), $key) > 0 ? "found" : "not found";
Run Code Online (Sandbox Code Playgroud)

这会将数组转换为包含等效 JSON 的字符串,然后使用该字符串作为 strpos() 函数的 haystack 参数,并使用 $key 作为needle 参数($key 是要在 JSON 字符串中查找的值)。

这样做有助于查看转换后的字符串: echo json_encode($array);

确保用单引号和双引号括起针参数,因为 JSON 字符串中名称/值对的名称部分将用双引号括起来。例如,如果在下面的数组中查找 22$key = '"22"'则将给出在此数组中找不到的正确结果:

$array =
Array ( 
        21 => Array ( ), 
        24 => 
        Array ( 
            522 => Array ( ),
            25 =>
                Array ( 
                26 => Array ( ) 
            )
        )
    );
Run Code Online (Sandbox Code Playgroud)

但是,如果不使用单引号,$key = "22"则上面的数组将导致found的错误结果。

编辑:进一步的改进是搜索是否存在数组中$key = '"22":';的值"22"。IE。27 => "22" 此外,这种方法不是防弹的。如果任何数组的值包含字符串,则可能会导致错误的发现'"22":'

  • 我会拒绝在简化情况下有效的解决方案,但在发生“特殊情况”时则无效。如果数组的值可能不包含可能干扰您的算法的所有任意值,则该算法是错误的 (2认同)

min*_*ost 5

function findKey($array, $keySearch)
{
    // check if it's even an array
    if (!is_array($array)) return false;

    // key exists
    if (array_key_exists($keySearch, $array)) return true;

    // key isn't in this array, go deeper
    foreach($array as $key => $val)
    {
        // return true if it's found
        if (findKey($val, $keySearch)) return true;
    }

    return false;
}

// test
$array = Array ( 
    21 => Array ( 24 => 'ok' ),
    24 => Array ( 
        22 => Array ( 29 => 'ok' ),
        25 => Array ( 
            26 => Array ( 32 => 'ok' ) 
        )
    )
);

$findKeys = Array(21, 22, 23, 24, 25, 26, 27, 28, 29, 30);
foreach ($findKeys as $key)
{
    echo (findKey($array, $key)) ? 'found ' : 'not found ';
    echo $key.'<br>';
}
Run Code Online (Sandbox Code Playgroud)