13

Lets say you are having a user provide information.

Array 1

But not all is required. So you have defaults.

Array 2

Does PHP have a function which will overwrite all array values of Array 2 based on if they are supplied in Array 1, and not empty?

1
  • This question is too vague and is missing a minimal reproducible example. We don't know what the input arrays look like. Answers are too varied and may only be circumstantially correct. Commented Oct 3, 2022 at 20:37

5 Answers 5

21

I think what you are looking for is array_replace_recursive, especially for the case when your "defualts" may be an associative array more than one level deep.

$finalArray = array_replace_recursive(array $defaults, array $inputOptions)

heres an example that takes an optional array of options to a function and does some processing based on the result of those options "opts" and the defaults which you specify:

function do_something() {
    $args = func_get_args();
            $opts = $args[0] ? $args[0] : array();

    $defaults = array(
        "second_level" => array(
                    "key1" => "val1",
                    "key2" => "val2"
                ),
        "key1" => "val1",
        "key2" =>  "val2",
        "key3" => "val3"
    );

    $params = array_replace_recursive($defaults, $opts);
    // do something with these merged parameters
}

The php.net reference document is here

Sign up to request clarification or add additional context in comments.

Comments

4

If you just want to keep the options that you expect and discard the rest you may use a combination of array_merge and array_intersect_key.

<?php

function foo($options) {
    $defaults = [
        'a' => 1,
        'b' => null,
    ];

    $mergedParams = array_merge(
        $defaults,
        array_intersect_key($options, $defaults)
    );

    return $mergedParams;
}


var_dump(foo([
    'a' => 'keep me',
    'c' => 'discard me'
]));

// => output
//
// array(2) {
//   ["a"]=>
//   string(7) "keep me"
//   ["b"]=>
//   NULL
// }

If you instead want to keep any extra key then array_merge($defaults, $options) will do just fine.

1 Comment

Yes this answer is of my liking :) Also I like the note you've added, that this is only if you want to remove the extra keys :) PS: I've added links to docs ;)
3
$defaults = array(
    'some_key_1'=>'default_value_1',
    'some_key_2'=>'default_value_2',
);

$inputs = array_merge($defaults, $inputs)

Note that if the $inputs array contains keys not in the $defaults array they will be added in the result.

3 Comments

this hardly adds any new insights to the existing answers
I appreciate that you can copy & paste to use this
If the $inputs array contains keys not in the $defaults array they will be added in the result, which is wrong.
1

array_merge() is exactly what you are looking for.

6 Comments

it's wrong, array_merge will add any key in the non-default array and you could end up with keys not available in the default array
@RiccardoGalli the keys not available in default array are not used anyway, I don't see this as issue.
This is meant more for 1-dimensional arrays or when rewriting array-like default value completely with provided value is the intended behaviour. Sidenote: performance speaking in PHP 5.6 it was faster to foreach, in PHP 7 there is almost no difference.
@jave.web "keys not available in default array are not used anyway" you can't really know that, for example you may want to store the user's current configuration, and you would end up storing who knows what (just as example). I think you should really avoid to have to worry about that and just drop unexpected keys
@RiccardoGalli my point is, when your design is right, this can not bother you :) Especially user's configuration that comes from user must be prepared anyway :) BTW: What would YOU suggest then? :)
|
0

You can just do something like

foreach($array1 as $key=>$value) $array2[$key]=$value;

1 Comment

As this will work in most of the cases, it directly overrides $array2 which is, in this use-case, the "defaults" array. This may or may not be intended behaviour.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.