首页 > 解决方案 > 为嵌套数组检查 in_array

问题描述

我有一个这种格式的数组,我想从任何键检查一个 var 是否在数组中link

    $nav = array(
        'Account Settings' => array(
            'icon' => 'fa-cog',
            'Account Settings' => array(
                'link' => '/voip/settings?seq='.$seq,
                'icon' => 'fa-cog',
            ),
            'Provisioning' => array(
                'link' => '/voip/provisioning?seq='.$seq,
                'icon' => 'fa-wrench',
            ),
            'E999 Data' => array(
                'link' => '/voip/e999?seq='.$seq,
                'icon' => 'fa-life-ring',
            ),
            'Delete Account' => array(
                'link' => '/voip/delete?seq='.$seq,
                'icon' => 'fa-trash',
            ),
        ),
        'Mailboxes' => array(
            'link' => '/voip/mailboxes?seq='.$seq,
            'icon' => 'fa-envelope',
        ),
        'Telephone Numbers' => array(
            'link' => '/voip/numbers?seq='.$seq,
            'icon' => 'fa-hashtag',
        ),
    );

我试过if(in_array($_GET["nav"], $nav)了,但它没有拾取嵌套值

有没有办法做到这一点?

标签: php

解决方案


没有现成的功能可以做到这一点。假设您有:

$key = 'link';
$value = '/voip/e999?seq=' . $seq;
// and $nav your multidimensionnal array

您可以编写自己的递归函数:

function contains_key_value_multi($arr, $key, $value) {
    foreach ($arr as $k => $v) {
        if ( is_array($v) && contains_key_value_multi($v, $key, $value) ||
             $k === $key && $v === $value )
            return true;
    }
    return false;
}

var_dump(contains_key_value_multi($nav, $key, $value));

您可以使用spl 类来遍历多维数组的叶子。这次你不需要递归函数:

$ri = new RecursiveIteratorIterator(new RecursiveArrayIterator($nav));

function contains_key_value($arr, $key, $value) {
    foreach ($arr as $k => $v) {
        if ( $k === $key && $v === $value ) 
            return true;
    }
    return false;
}

var_dump(contains_key_value($ri, $key, $value));


推荐阅读