Reputation:
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
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
)
)
)
Upvotes: 1
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);
Upvotes: 1