PHP-通过键在对象数组中查找对象,更新其值

时间:2018-10-27 16:23:14

标签: php object

我有一个对象数组,并且想要更新其中一个对象的属性。

$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}]

这使我们想到了原始问题。

4 个答案:

答案 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;

https://3v4l.org/7tJl0

答案 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;
}