Skip to content
Advertisement

PHP – Find an object by key in an array of objects, update its value

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.

User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement