daktau
daktau

Reputation: 643

Standardise a multidimensional array in php

I have a multidimensional array like this

Array
(
[0] => Array
    (
        ['key-A'] => 'val1'
        ['key-B'] => 'val2'
    )
[1] => Array
    (
        ['key-A'] => 'val3'
        ['key-C'] => 'val4'
    )
[2] => Array
    (
        ['key-B'] => 'val5'
        ['key-C'] => 'val6'
    )
)

How would I change this into a multidimensional array that is standardised so that all the keys were present and a null value entered if the key was not present?

eg.

Array
(
[0] => Array
    (
        ['key-A'] => 'val1'
        ['key-B'] => 'val2'
        ['key-C'] => null
    )
[1] => Array
    (
        ['key-A'] => 'val3'
        ['key-B'] => null
        ['key-C'] => 'val4'
    )
[2] => Array
    (
        ['key-A'] => null
        ['key-B'] => 'val5'
        ['key-C'] => 'val6'
    )
)

Upvotes: 1

Views: 80

Answers (6)

dev87
dev87

Reputation: 164

Try this code

    $ss= Array
 (
'0' => Array
(
    'key-A' => 'val1',
    'key-B' => 'val2'
),
'1' => Array
(
    'key-A' => 'val3',
    'key-C' => 'val4'
),
'2' => Array
(
    'key-B' => 'val5',
    'key-C' => 'val6'
)
);


$key = array("A","B","C");
$var = array();
foreach($ss as $k => $v)
{
    foreach($key as $v2)
    {
        $var[$k]["key-{$v2}"] = isset($v["key-{$v2}"]) ? $v["key-{$v2}"] : "null";
    }
}

print_r($var);

You get the following result :

Array
(
    [0] => Array
        (
            [key-A] => val1
            [key-B] => val2
            [key-C] => null
        )

    [1] => Array
        (
            [key-A] => val3
            [key-B] => null
            [key-C] => val4
        )

    [2] => Array
        (
            [key-A] => null
            [key-B] => val5
            [key-C] => val6
        )

)

Upvotes: 0

Dhaval Vansajaliya
Dhaval Vansajaliya

Reputation: 26

$array = array(
    [0] => array(
               ['key-A'] => 'val1'
               ['key-B'] => 'val2'
               ['key-C'] => null
           )
    [1] => array(
               ['key-A'] => 'val3'
               ['key-B'] => null
               ['key-C'] => 'val4'
           )
    [2] => array(
               ['key-A'] => null
               ['key-B'] => 'val5'
               ['key-C'] => 'val6'
           ));

Upvotes: -1

JYoThI
JYoThI

Reputation: 12085

try this using array key exists function

<?php

$ss= Array
 (
'0' => Array
(
    'key-A' => 'val1',
    'key-B' => 'val2'
),
'1' => Array
(
    'key-A' => 'val3',
    'key-C' => 'val4'
),
'2' => Array
(
    'key-B' => 'val5',
    'key-C' => 'val6'
)
);

  print_r($ss);

 foreach($ss as $key=>$row)
  {

 if(!array_key_exists('key-A',$row))
 {

   $ss[$key]['key-A']='null';

 }

if(!array_key_exists('key-B',$row))
 {

   $ss[$key]['key-B']='null';

 }

if(!array_key_exists('key-C',$row))
 {

   $ss[$key]['key-C']='null';

 }



  }

 echo "<PRE>";
 print_r($ss);

Upvotes: 0

iainn
iainn

Reputation: 17417

<?php
$arrays = [
    [
        'key-A' => 'val1',
        'key-B' => 'val2',
    ],
    [
        'key-A' => 'val3',
        'key-C' => 'val4',
    ],
    [
        'key-B' => 'val5',
        'key-C' => 'val6',
    ],
];

// First build up a single array containing all the keys present
$allKeys = [];

foreach ($arrays as $array)
{
    $allKeys = array_unique(array_merge(array_keys($array), $allKeys));
}

// Then loop over the original array, merging the existing values into an array
// containing all the known keys
foreach ($arrays as &$array)
{
    $array = array_merge(array_combine(
        $allKeys,
        array_fill(0, count($allKeys), null)
    ), $array);
}

print_r($arrays);

Upvotes: 2

Peter Chaula
Peter Chaula

Reputation: 3711

You can use php [array_fill][1]

[1]: http://php.net/manual/en/function.array-fill.php function

$arr = array_fill(0, num_of_items_you_need, array(
           'A' => null,
           'B' => null, 
           'C' => null
          )
       );
//now you have null as default

Upvotes: 0

jancha
jancha

Reputation: 4967

<?php

$input_array = [
    [
        "foo" => 1,
        "bar" => 2
    ],
    [
        "baq" => 3,
        "baz" => 4
    ]
];

$unique = [];

foreach ($input_array as $row){
    foreach ($row as $k => $v){
        $unique[$k] = true;
    }
}

foreach ($input_array as $iak => $row){
    foreach ($unique as $k => $v){
        if (!isset($row[$k])){
            $input_array[$iak][$k] = null;
        }
    }
}

var_dump($input_array);

Upvotes: 1

Related Questions