user12799634
user12799634

Reputation:

Updating the value in existing JSON data by key in PHP

I have JSON data and want to update the value by key.

JSON:

{
 "language":"en",
 "education":[
                {
                   "unit":"e1",
                   "language":"en"
                 }
              ],
 "membership":[
                {
                  "uei":"21",
                  "Uifed":"failed"
                }
              ]
}

I want to change the value of uifed from "failed" to "success".

What have I done?

$json = '{"language":"en","education":[{"unit":"e1","language":"en"}],"membership":[{"uei":"21","Uifed":"failed"}]}';
$arrayData = json_decode($json, true);
$replacementData = array('Uifed' => 'success');
$newArrayData = array_replace_recursive($arrayData, $replacementData);

echo var_dump($newArrayData);

Result:

NULL

How can I do that?

Upvotes: 0

Views: 72

Answers (2)

Nick
Nick

Reputation: 147206

That's not how array_replace_recursive works; the replacement arrays need to have the same structure as the one you are replacing into. For your sample data, this will work:

$json = '{"language":"en","education":[{"unit":"e1","language":"en"}],"membership":[{"uei":"21","Uifed":"failed"}]}';
$arrayData = json_decode($json, true);
$replacementData = array('membership' => array(array('Uifed' => 'success')));
$newArrayData = array_replace_recursive($arrayData, $replacementData);

print_r($newArrayData);

Output:

Array
(
    [language] => en
    [education] => Array
        (
            [0] => Array
                (
                    [unit] => e1
                    [language] => en
                )
        )
    [membership] => Array
        (
            [0] => Array
                (
                    [uei] => 21
                    [Uifed] => success
                )
        )

)

array_walk_recursive can be used to do what you want:

$replacementData = array('Uifed' => 'success');
array_walk_recursive($arrayData, function (&$value, $key) use ($replacementData) {
    $value = $replacementData[$key] ?? $value;
});

print_r($arrayData);

Output:

Array
(
    [language] => en
    [education] => Array
        (
            [0] => Array
                (
                    [unit] => e1
                    [language] => en
                )
        )
    [membership] => Array
        (
            [0] => Array
                (
                    [uei] => 21
                    [Uifed] => success
                )
        )
)

Demo on 3v4l.org

Upvotes: 1

u_mulder
u_mulder

Reputation: 54831

Simple example with foreach and passing values by reference:

$json = '{"language":"en","education":[{"unit":"e1","language":"en"}],"membership":[{"uei":"21","Uifed":"failed"}]}';
$arrayData = json_decode($json, true);
foreach ($arrayData['membership'] as &$membership) {
    if ('failed' === $membership['Uifed']) {
        $membership['Uifed'] = 'success';
    }
}
print_r($arrayData);

Fiddle.

Upvotes: 1

Related Questions