-2

i have an multidimensional dynamic array and so it looks like:

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

And what i need is:

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

The big problem is that this array is dynamic , how can i do it?

2 Answers2

1

You can use array_merge, call_user_func_array, array_keys and array_fill_keys to get all keys.

Use map to loop thru your array and fill the missing keys

$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>";

This will result to:

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
        )

)
Eddie
  • 26,593
  • 6
  • 36
  • 58
0

Here is my answer, though i think there is a better way to do this:

<?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);
?>

Output:

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
        )

)
131
  • 1,363
  • 1
  • 12
  • 32