【问题标题】:Access multidimensional associative array using integer index使用整数索引访问多维关联数组
【发布时间】:2017-03-21 18:40:14
【问题描述】:

假设我有一个如下所示的关联数组:

$arr = array(
    'a' => array(
            'b' => 'b',
            'c' => 'c',
            'd' => array(
                    'e' =>'e'
            ),
            'f' => 'f',
            'g' => 'g'
    ),
    'h' => 'h',
    'i' => array(
            'j' => 'j',
            'k' => 'k'
    )
);

现在我想使用整数索引访问数组元素:

0 will return array of key 'a'  
1 will return array of key 'b'
2 will return array of key 'c'
3 will return array of key 'd'
4 will return array of key 'e'
..
11 will return array of key 'k'

我尝试使用以下代码通过递归来完成此操作:

function getElement($arr, $id)
{
    static $counter = 0;

    foreach($arr as $key => $val){
        $varNum = count($val);
        $total = $counter + $varNum;
        if($counter == $id){
            return $val;
        }
        elseif($total > $id){
            $counter++;
            $res = getElement($val, $id);
            return $res;
        }
        $counter++;
    }
}

但是,从索引 4 开始,该功能失败了。
有什么建议吗?

【问题讨论】:

    标签: php arrays multidimensional-array associative-array


    【解决方案1】:

    使用array_walk_recursive

    $list = [];
    
    array_walk_recursive($arr, function($value) use (&$list) {
        $list[] = $value;
    });
    
    print_r($list);
    

    将返回类似:

    Array
    (
        [0] => b
        [1] => c
        [2] => e
        [3] => f
        [4] => g
        [5] => h
        [6] => j
        [7] => k
    )
    

    现在要返回完整的键列表,您可以使用以下函数:

    function walk_recursive($arr, &$list = [])
    {
        foreach ($arr as $k => $ar) {
            if (is_array($ar)) {
                $list[] = $k;
                walk_recursive($ar, $list);
            } else {
                $list[] = $ar;
            }
        }
        return $list;
    }
    print_r(walk_recursive($arr));
    

    这个输出如下:

    Array
    ( 
        [0] => a
        [1] => b
        [2] => c
        [3] => d
        [4] => e
        [5] => f
        [6] => g
        [7] => h
        [8] => i
        [9] => j
        [10] => k
    )
    

    实时示例:https://3v4l.org/Wv0nL

    【讨论】:

    • omg,给我五分钟,我已经用我的手机从 SO 移动应用程序编写了这段代码
    • 我编辑使用参考,所以它可以工作,但不是 OP 指定的方式。
    • 我知道,我现在要更新我的答案,谢谢你
    • @AbraCadaver 现在我添加了新功能来获取指定 OP 的完整列表;
    • 我认为如果您将$list[] = $k; 更改为$list[] = $ar;,这将按照OP 所述工作。不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多