I have an array of objects, and want to update an attribute of one of the objects.
$objs = [ ['value' => 2, 'key' => 'a'], ['value' => 3, 'key' => 'b'] , ];
Let’s say I want to set the ‘value’ of the object with ‘key’=>’a’ to 5.
Aside from iterating over the array searching for the key, is there any quicker/efficient way of doing this?
Thanks.
EDIT: There is debate as to why I can’t use an associative array. It is because this array is obtained from a JSON value.
If my JSON object is this:
"obj": { "a": { "key": "a", "value": 2 }, "b": { "key": "b", "value": 3 } }
There is no guarantee that the order of the objects will be retained, which is required.
Hence I need an index in each object to be able to sort it using usort()
. So my JSON needs to be:
"obj": { "a": { "key": "a", "value": 2, "index": 1 }, "b": { "key": "b", "value": 3, "index": 2 } }
But I cannot use usort()
on an object, only on arrays. So my JSON needs to be
"obj": [ { "key": "a", "value": 2, "index": 1 }, { "key": "b", "value": 3, "index":2 } ]
Which brings us to the original question.
Advertisement
Answer
By using array_column()
, you can pull all the values with the index key
in the arrays. Then you can find the first occurrence of the value a
by using array_search()
. This will only return the first index where it finds a value. Then you can simply replace that value, as you now have the index of that value.
$keys = array_column($objs, 'key'); $index = array_search('a', $keys); if ($index !== false) { $objs[$index]['value'] = 5; }
See this live demo.