多维array_values仅适用于整数键


Multidimensional array_values only on integer keys

我正在尝试编写代码来组织数组。我有这个代码:

$arr =  array(0=>array('key 1'=>'value 1', 'key 2'=>'value 2', 'key 3'=> array('2'=>'more values 1', '5'=>'more values 2', 7=>'more values 3')),
              2=>array(0=>'value 1', 2=>'value 2', 4=> array('key 2'=>'more values 1', 'key 5'=>'more values 2', 'key 7'=>'more values 3')));
echo print_r($arr);

收益率:

Array
(
    [0] => Array
        (
            [key 1] => value 1
            [key 2] => value 2
            [key 3] => Array
                (
                    [2] => more values 1
                    [5] => more values 2
                    [7] => more values 3
                )
        )
    [2] => Array
        (
            [0] => value 1
            [2] => value 2
            [4] => Array
                (
                    [key 2] => more values 1
                    [key 5] => more values 2
                    [key 7] => more values 3
                )
        )
)

我希望整数的键可以用array_values()重命名。数组需要这样的输出:

Array
(
    [0] => Array
        (
            [key 1] => value 1
            [key 2] => value 2
            [key 3] => Array
                (
                    [0] => more values 1
                    [1] => more values 2
                    [2] => more values 3
                )
        )
    [1] => Array
        (
            [0] => value 1
            [1] => value 2
            [2] => Array
                (
                    [key 2] => more values 1
                    [key 5] => more values 2
                    [key 7] => more values 3
                )
        )
)

但不幸的是,我无法生成一个有效的代码。

您很少需要这样做,因为您可以访问数组元素而无需递增键,比如使用foreach()。但这里有一个递归函数:

function array_reindex_recursive(&$array) {
    if(is_int(key($array))) {
        $array = array_values($array);
    }
    foreach($array as $key => &$val) {
        if(is_array($val)) {
            array_reindex_recursive($val);
        }
    }
}    
array_reindex_recursive($arr);
  • 检查数组中的第一个键是否为整数(如果其他键不是整数,这可能是个问题)
  • 如果是,请运行array_values()以重新索引
  • 循环遍历这些值,如果其中一个是数组,则递归调用该函数

如果你想确保所有密钥都是整数,那么用这样的东西替换第一个if

if(count(array_filter(array_keys($array), 'is_int')) == count($array)) {
    $array = array_values($array);
}
  • 过滤掉所有非整数键,并与原始数组的长度进行比较
  • 如果长度相同,则所有键都是整数,请运行array_values()重新索引