rorymorris89
rorymorris89

Reputation: 1189

Merge array with varying key value pairs

So I have various arrays which do not always have the same key/value pairs in them. What I want to do is to be able to merge the arrays, but to add in empty key/value pairs if they don't already exist in that array, but do in others. It's hard to explain but this might explain it better:

$arrayOne = array('name' => 'rory', 'car' => 'opel');
$arrayTwo = array('name' => 'john', 'dog' => 'albert');

I need to somehow turn this into:

$finalArray = array(
    array('name' => 'rory', 'car' => 'opel', 'dog' => ''),
    array('name' => 'john', 'car' => '', 'dog' => 'albert')
);

I have been looking through PHP's documentation but can't find anything that will do this for me. Can anyone point me in the right direction? I don't even know an appropriate search term for what I want to achieve here, "array merge" isn't specific enough.

Upvotes: 0

Views: 676

Answers (4)

rorymorris89
rorymorris89

Reputation: 1189

Basing on what Justin Powell outlined, I managed to come up with this code before the other two code examples were posted (thank you mamta & user6439245).

I also needed to take the keys containing numbers and sort them appropriately, otherwise my keys would've been indexed like employer_1, education_1, employer_2, education_2.

// get the initial form entries data
$entries = array(
    array('name' => 'john', 'car' => 'fiat', 'employer_1' => 'tangerine', 'education_1' => 'hideaways', 'education_2' => 'extras'),
    array('name' => 'rory', 'car' => 'opel', 'employer_1' => 'sagittarius', 'employer_2' => 'tangerine', 'employer_3' => 'thehideout', 'education_1' => 'knatchbull')
);


// create an empty array to populate with all field keys
$mergedKeys = array();

// push all field keys into the array
foreach($entries as $entry){
    foreach($entry as $key => $value){
        array_push($mergedKeys, $key);
    }
}

// remove duplicate keys from the array
$uniqueMergedKeys = array_unique($mergedKeys);

// create a new array to populate with the field keys we need to sort - the ones with numbers in
$keysToSort = array();

// push the number-containing keys into the array
$i=0;
foreach($uniqueMergedKeys as $uniqueKey){
    if(1 === preg_match('~[0-9]~', $uniqueKey)){
        array_push($keysToSort, $uniqueKey);
    }
    $i++;
}

// remove the number containing keys from the unique keys array
$uniqueMergedKeys = array_diff($uniqueMergedKeys, $keysToSort);

// sort the keys that need sorting
sort($keysToSort);

// put the newly sorted keys back onto the original keys array
foreach($keysToSort as $key){
    array_push($uniqueMergedKeys, $key);
}

$final = array();

$i = 0;
foreach($entries as $entry){

    foreach($uniqueMergedKeys as $key){
        //if($entries[$i][$key]){
        if (array_key_exists($key, $entries[$i])) {
            $final[$i][$key] = $entries[$i][$key];
        } else {
            $final[$i][$key] = '';
        }
    }

    $i++;
}

echo '<pre>'; print_r($final); echo '</pre>';

Upvotes: 0

Passionate Coder
Passionate Coder

Reputation: 7294

<?php
$arrayOne = array('name' => 'rory', 'car' => 'opel');
$arrayTwo = array('name' => 'john', 'dog' => 'albert');
$new = array_merge($arrayOne,$arrayTwo);
$new = array_keys($new);
$newarray = array();        
foreach($new as $value){            
$newarray[0][$value] = isset($arrayOne[$value]) ? $arrayOne[$value] :  '' ;
$newarray[1][$value] = isset($arrayTwo[$value]) ? $arrayTwo[$value] :  '' ;         
        }
        echo "<pre>";print_r($newarray);

You can also use this short answer

$arrayOne = array('name' => 'rory', 'car' => 'opel');
$arrayTwo = array('name' => 'john', 'dog' => 'albert');
$defaults = array('name' => '','car'  => '','dog' => '');
$arrayOne += $defaults;
$arrayTwo += $defaults;
$newarray = array($arrayOne,$arrayTwo);
echo "<pre>";print_r($newarray);

Upvotes: 1

SML
SML

Reputation: 1265

<?php
$arrayOne = array('name' => 'rory', 'car' => 'opel');
$arrayTwo = array('name' => 'john', 'dog' => 'albert');

$diff1=array_diff(array_flip($arrayOne), array_flip($arrayTwo));
$diff2=array_diff(array_flip($arrayTwo), array_flip($arrayOne));
//array_flip flips the key of array with value
//array_diff would return the values in the first array that are not present in any of the other arrays inside

foreach ($diff2 as $s) {
    $arrayOne[$s]="";
}
foreach ($diff1 as $s) {
    $arrayTwo[$s]="";
};
//set key that didn't exist in that array as ""

$finalArray[]=$arrayOne;
$finalArray[]=$arrayTwo;
//add the arrays to the final array

print_r($finalArray);

Upvotes: 2

JstnPwll
JstnPwll

Reputation: 8685

Here's what I would do:

  1. Merge your separate arrays into one (into a temporary var) using array_merge
  2. Get the unique keys of this new array using array_keys
  3. For each separate array, loop through the new keys array and add an empty value for each key that is not in the array. Then push the separate array into a final array.

Upvotes: 1

Related Questions