我有一个对象数组,并且想要更新其中一个对象的属性。
$objs = [ ['value'=>2, 'key'=>'a'], ['value'=>3, 'key'=>'b'] ];
假设我想将对象的“键” =>“ a”的“值”设置为5。
除了遍历数组以查找键之外,还有什么更快速/有效的方法可以做到这一点?
谢谢。
编辑:关于为什么不能使用关联数组存在争论。这是因为此数组是从JSON值获得的。
如果我的JSON对象是这样:
"obj":{"a":{"key":"a", "value":2}, "b":{"key":"b", "value":3}}
不能保证必须保留对象的顺序。
因此,我需要每个对象都有一个索引,才能使用usort()对它进行排序。所以我的JSON必须是:
"obj":{"a":{"key":"a", "value":2, "index":1}, "b":{"key":"b", "value":3, "index":2}}
但是我不能在对象上使用usort(),只能在数组上使用。所以我的JSON必须是
"obj":[{"key":"a", "value":2, "index":1}, {"key":"b", "value":3, "index":2}]
这使我们想到了原始问题。
答案 0 :(得分:1)
通过使用array_column()
,可以在数组中提取索引为key
的所有值。然后,您可以使用a
找到值array_search()
的第一个匹配项。这只会返回找到值的第一个索引。然后,您可以简单地替换该值,因为现在有了该值的索引。
$keys = array_column($objs, 'key');
$index = array_search('a', $keys);
if ($index !== false) {
$objs[$index]['value'] = 5;
}
请参阅此live demo。
答案 1 :(得分:0)
您可以使数组与数组列关联。这样,您可以直接分配值。
$objs = [ ['value'=>2, 'key'=>'a'], ['value'=>3, 'key'=>'b'] ];
$objs = array_column($objs, null, "key");
$objs['a']['value'] = 5;
答案 2 :(得分:0)
除了遍历数组以查找键之外,还有 任何更快捷/有效的方法?
您必须以任何一种方式支付迭代的代价。
您可以在集合中搜索有趣的对象(花费线性时间),或者形成某种字典数据结构,例如哈希表(采用线性时间),然后在恒定时间内找到感兴趣的对象。
这里没有免费的午餐。
答案 3 :(得分:0)
我建议您重新组织阵列湖:
$objs = [
'a' => ['value'=>2, 'key'=>'a'],
'b' => ['value'=>3, 'key'=>'b']
];
现在
if( array_key_exists( 'a', $objs )) {
$objs ['a'] ['value'] = 5;
}
最初我是那样的。但是我需要这些物体有一个 它们中的索引值,因此我可以在主数组上运行usort()。这是 因为数组来自JSON,而原始顺序不是 尊敬的
然后创建一个index
数组:
// When fill `$objs` array
$objs = [];
$arrIndex = [];
$idx = 0;
foreach( $json as $item ) {
$arrIndex [ $item ['key']] = $idx;
$objs [$idx ++] = $item;
}
// And your task:
if( array_key_exists( 'a', $arrIndex )) {
$objs [ $arrIndex ['a']] ['value'] = 5;
}