多维动态数组差异键和值php

时间:2018-04-23 09:41:41

标签: php arrays

我有一个多维动态数组,所以它看起来像:

    $array = array(
   'name1' => [],
   'name2' => array('x1' => 25, 'a2' => 10, 'y3' => 8),
   'name3' => array('x3' => 5, 'y3' => 6)
    );

我需要的是:

        $array = array(
   'name1' => array('x1' => 0, 'a2' => 0, 'y3' => 0, 'x3' => 0),
   'name2' => array('x1' => 25, 'a2' => 10, 'y3' => 8, 'x3' => 0),
   'name3' => array('x1' => 0, 'a2' => 0, 'y3' => 6, 'x3' => 5)
    );

最大的问题是这个阵列是动态的,我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用array_mergecall_user_func_arrayarray_keysarray_fill_keys来获取所有密钥。

使用map循环播放数组并填充缺少的键

$array = array(
   'name1' => [],
   'name2' => array('x1' => 25, 'a2' => 10, 'y3' => 8),
   'name3' => array('x3' => 5, 'y3' => 6)
);

//Get all keys and assign 0 as default
$keys = array_fill_keys(array_keys( call_user_func_array('array_merge', $array) ), 0);

//Map the array and check
$results = array_map(function($v) use($keys) {
    $arr = array();
    foreach( $keys as $key => $val ) {
        $arr[$key] = isset( $v[$key] ) ? $v[$key] : 0;
    }
    return $arr;
}, $array);


echo "<pre>";
print_r( $results );
echo "</pre>";

这将导致:

Array
(
    [name1] => Array
        (
            [x1] => 0
            [a2] => 0
            [y3] => 0
            [x3] => 0
        )

    [name2] => Array
        (
            [x1] => 25
            [a2] => 10
            [y3] => 8
            [x3] => 0
        )

    [name3] => Array
        (
            [x1] => 0
            [a2] => 0
            [y3] => 6
            [x3] => 5
        )

)

答案 1 :(得分:0)

这是我的答案,但我认为有更好的方法可以做到这一点:

<?php
$array = array(
    'name1' => [],
    'name2' => array('x1' => 25, 'a2' => 10, 'y3' => 8),
    'name3' => array('x3' => 5, 'y3' => 6)
);
$keys=['x1','a2','y3','x3'];

$l=sizeof($array);
for($i=1;$i<=$l;$i++){
    if($i!=$l){
        foreach($keys as $k){
            if(!isset($array["name$i"][$k])) $array["name$i"][$k]=0;
        }
    }
    else{
        foreach($keys as $k) if(!isset($array["name$i"][$k])) $array["name$i"][$k]=0;
    }
}

echo "<h2><pre>";
print_r($array);
?>

输出:

Array
(
    [name1] => Array
        (
            [x1] => 0
            [a2] => 0
            [y3] => 0
            [x3] => 0
        )

    [name2] => Array
        (
            [x1] => 25
            [a2] => 10
            [y3] => 8
            [x3] => 0
        )

    [name3] => Array
        (
            [x3] => 5
            [y3] => 6
            [x1] => 0
            [a2] => 0
        )

)