仅在整数键上的多维array_values

时间:2016-05-13 19:25:15

标签: php arrays

我试图制作代码来组织一个数组。我有这段代码:

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

但遗憾的是,我无法制作有效的代码。

1 个答案:

答案 0 :(得分:2)

您需要这样做是非常罕见的,因为您可以访问数组元素而无需增加键,例如使用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()以重新索引