binoculars
binoculars

Reputation: 2274

Update values of array if present in other array

I have this array $a:

[0] => Array
    (
        [param] => banana
        [value] => yellow
    )

[1] => Array
    (
        [param] => lemon
        [value] => 3
    )

[2] => Array
    (
        [param] => apple
        [value] => 18
    )

... and array $b:

[0] => Array
    (
        [param] => banana
        [value] => brown
    )

[1] => Array
    (
        [param] => orange
        [value] => 3
    )

[2] => Array
    (
        [param] => lemon
        [value] => 4
    )

[3] => Array
    (
        [param] => pear
        [value] => green
    )

Array $c should be a copy of $a, but, if $b contains certain params that are present in $a, the values from $a should be update with those from $b.

So $c would become:

[0] => Array
    (
        [param] => banana
        [value] => brown
    )

[1] => Array
    (
        [param] => lemon
        [value] => 4
    )

[2] => Array
    (
        [param] => apple
        [value] => 18
    )

Any tips?

Upvotes: 0

Views: 42

Answers (2)

Rahul
Rahul

Reputation: 18557

You can use array-map with multiple arrays,

$c = array_filter(array_map(function ($a1, $b1) {
    if ($a1['param'] == $b1['param']) {
        $a1['value'] = $b1['value'];
        return $a1;
    } else {
        return $a1;
    }

}, $a, $b));

Demo

EDIT

$bData = array_column($b,'value','param'); // param as key and value as value
foreach($a as &$v){
    $v['value'] = ($bData[$v['param']] ?? $v['value']); // php 7+   
    //or $v['value'] = (!empty($bData[$v['param']]) ? $bData[$v['param']] :   $v['value']);    // php 5.6 or previous

}

Demo

Output

Array
(
    [0] => Array
        (
            [param] => banana
            [value] => brown
        )

    [1] => Array
        (
            [param] => lemon
            [value] => 4
        )

    [2] => Array
        (
            [param] => apple
            [value] => 18
        )

)

Upvotes: 1

Etin
Etin

Reputation: 365


    $a = ['banana' => 'yellow', 'apple' => 3, 'lemon' => 18];

    $b = ['banana' => 'brown', 'orange' => 3, 'lemon' => 4];

    $a_keys = array_keys($a);

    $c = $a;

    foreach ($a_keys as $key) {
        if(array_key_exists($key, $b)){
            $c[$key] = $b[$key];
        }
    }

Upvotes: 0

Related Questions