24

我有一个多维数组,例如(这可能有很多层次):

$array = Array ( 
    [21] => Array ( ) 
    [24] => Array ( 
        [22] => Array ( ) 
        [25] => Array ( 
            [26] => Array ( ) 
        ) 
    ) 
) 

我正在尝试遍历它以查看是否存在某个键:

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

但它什么也没找到。循环中有错误吗?

4

8 回答 8

49

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

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

于 2013-10-17T07:40:17.377 回答
43

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

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;
}
于 2013-10-17T07:52:16.473 回答
10

这是一个单行解决方案:

echo strpos(json_encode($array), $key) > 0 ? "found" : "not found";

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

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

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

$array =
Array ( 
        21 => Array ( ), 
        24 => 
        Array ( 
            522 => Array ( ),
            25 =>
                Array ( 
                26 => Array ( ) 
            )
        )
    );

但是,如果单引号被省略,$key = "22"那么上面的数组将产生不正确的found结果。

编辑:进一步的改进是只搜索数组中存在$key = '"22":';的值。"22"IE。27 => "22" 此外,这种方法不是万无一失的。如果数组的任何值包含字符串,则可能导致不正确的找到'"22":'

于 2017-11-28T13:06:54.153 回答
4
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>';
}
于 2013-10-17T07:51:20.063 回答
3

如果不存在则返回 false,如果存在则返回第一个实例;

function searchArray( array $array, $search )
{
    while( $array ) {
        if( isset( $array[ $search ] ) ) return $array[ $search ];
            $segment = array_shift( $array );
            if( is_array( $segment ) ) {
                if( $return = searchArray( $segment, $search ) ) return $return;
            }
        }
    }
    return false;
}
于 2017-03-16T11:51:18.897 回答
2

肯定有一些错误,这大致是你所追求的吗?(未经测试的代码):

$keySearch=22;// 密钥搜索

function findKey($array, $keySearch) 
{ 
    // check whether input is an array
    if(is_array($array)
    {
       foreach ($array as $item)
       {
         if (isset($item[$keySearch]) || findKey($item, $keysearch) === true)
          {
            echo 'yes, it exists';
            return true;
          }
       }
    }
}
于 2013-10-17T07:38:56.533 回答
0

这是一种在任何维度数组中查找并返回键值的解决方案。

function findValByKey($arr , $keySearch){
    $out = null;
    if (is_array($arr)){
        if (array_key_exists($keySearch, $arr)){
            $out = $arr[$keySearch];
        }else{
            foreach ($arr as $key => $value){
                if ($out = self::findValByKey($value, $keySearch)){
                    break;
                }
            }
        }
    }
    return $out;
}
于 2020-12-06T12:55:22.430 回答
0
function arrayKeyExsits($array, $keyPath): bool {
    $keys = explode('=>', $keyPath);
    if (count($keys) === 1) {
        return array_key_exists($keyPath, $array);
    } else {
        $key = array_shift($keys);
        if (array_key_exists($key, $array)) {
            return arrayKeyExsits($array[$key], implode('=>', $keys));
        } else {
            return false;
        }
    }
}
$array = [
    'level1' => [
        'level2' => [
            'level3' => [
             ]
        ]
    ]
];

var_dump(arrayKeyExists($array, 'level1')) // true
var_dump(arrayKeyExists($array, 'level1=>level2')) // true
var_dump(arrayKeyExists($array, 'level1=>level2=>level3')) // true

var_dump(arrayKeyExists($array, 'foo')) // false
var_dump(arrayKeyExists($array, 'level1=>foo=>level3')) // false

于 2022-01-30T08:35:04.193 回答