Matt
Matt

Reputation: 3894

Filter and update an array with mixed keys using another array with mixed keys

I have two arrays.

$arr1 = array(
    'name',
    'date' => array('default' => '2009-06-13', 'format' => 'short'),
    'address',
    'zipcode' => array('default' => 12345, 'hidden' => true)
);

$arr2 = array(
    'name',
    'language',
    'date' => array('format' => 'long', 'hidden' => true),
    'zipcode' => array('hidden' => false)
);

Here's the desired result:

$final = array(
    'name',
    'date' => array('default' => '2009-06-13', 'format' => 'long', 'hidden' => true),
    'zipcode' => array('default' => 12345, 'hidden' => false)
);

What are some good approaches for solving this problem?

I tried to hobble something together... critiques welcomed:**

$new_array = array_intersect_key($arr2, $arr1);

foreach ($new_array as $key => $val)
{
    if (is_array($arr1[$key]))
    {
        if (is_array($val))
        {
            $new_array[$key] = array_merge($val, $arr1[$key]);
        }
        else
        {
            $new_array[$key] = $arr1[$key];
        }
    }
}

Upvotes: 2

Views: 1353

Answers (2)

mickmackusa
mickmackusa

Reputation: 47874

Your described logic appears to:

  • retain the indexed values of the first array which are found as indexed values of the second array, and
  • overwrite the subarray elements of associative values in the first array which with corresponding subarrays of the second array.

It is unclear/unknown if an associative element might not have a subarray, so this is not built into the sceipt below. Demo

$arr2List = array_filter(
    $arr2,
    is_int(...),
    ARRAY_FILTER_USE_KEY
);

$result = [];
foreach ($arr1 as $k => $v) {
    if (is_int($k)) {
        if (in_array($v, $arr2List)) {
            $result[] = $v;
        }
    } elseif (
        is_array($v)
        && is_array($arr2[$k] ?? null)
    ) {
        $result[$k] = array_replace($v, $arr2[$k]);
    }
}
var_export($result);

Upvotes: 0

Ian Elliott
Ian Elliott

Reputation: 7686

You were close

$newArr = array_intersect_key($arr1, $arr2);
foreach ($newArr as $key => $val)
{
    if (is_array($val))
    {
        $newArr[$key] = array_merge($arr1[$key], $arr2[$key]);
    }
}

Edit Just had to change the array_intersect to array_intersect_key

Upvotes: 2

Related Questions