danmtslatter
danmtslatter

Reputation: 11

PHP merge 2 arrays with different number of elements, $keys from one, $values from another

I want to merge 2 arrays together that have a different number of elements, using the keys from one and the values from another where/if the keys match. The array that contains the desired values may have less elements in it although I would like to retain the resulting empty keys from the original array. For example:

//Array that contains keys I would like to retain

$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);

//Array that contains values I'd like to use

$arr2 = array(01=>123, 03=>123, 05=>123, 07=>123, 09=>123, 11=>123);

//The desired result with some valueless elements

$results = array(01=>123, 02, 03=>123, 04, 05=>123, 06, 07=>123, 08, 09=>123, 10, 11=>123, 12);

As you can see the results array retains 12 elements but only applies values to where the keys from the 2 arrays match.

I have tried $results = array_intersect_key($arr1 + $arr2, $arr2); among other PHP functions as well as:

for ($i=1; $i < count($arr1); $i++) {
    if (isset($arr2[$i])) {
        $arr3[] = $arr2[$i];
    } else {
        $arr3[] = $arr1[$i];
    }
}

print_r($arr3);

No luck as yet.

Thanks in advance!

Upvotes: 0

Views: 463

Answers (3)

Francis Booth
Francis Booth

Reputation: 676

First set your $arr1's values to false to retain just the keys: $arr1 = array_fill_keys(array_keys($arr1), false); Or if you're generating $arr1 yourself, define it as such to start with: $arr1 = Array(false, false, false, false /* etc. */);

Now use the array union operator:

$result = $arr2 + $arr1;

The + operator returns the right-hand array appended to the left-hand array; for keys that exist in both arrays — from the docs: http://php.net/manual/en/language.operators.array.php)

Then if required sort the array by key: ksort($array);

Upvotes: 0

Don&#39;t Panic
Don&#39;t Panic

Reputation: 41810

For arrays like this

$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
$arr2 = array(1=>123, 3=>123, 5=>123, 7=>123, 9=>123, 11=>123);

this should work.

foreach ($arr1 as $key) {
    $results[$key] = isset($arr2[$key]) ? $arr2[$key] : null;
}

or using some other PHP functions:

$results = array_replace(array_fill_keys($arr1, null), $arr2);

Upvotes: 2

Mark Baker
Mark Baker

Reputation: 212412

//Array that contains keys I would like to retain
$arr1 = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);

//Array that contains values I'd like to use
$arr2 = array(1=>123, 3=>123, 5=>123, 7=>123, 9=>123, 11=>123);

$result = array_fill_keys(
    $arr1,
    null
);
array_walk(
    $result,
    function(&$value, $key) use($arr2) {
        $value = (isset($arr2[$key])) ? $arr2[$key] : null;
    }
);
var_dump($result);

Upvotes: 1

Related Questions