使用某一列作为新的一级键,将对象的索引数组转换为关联数组。

11

$var 是一个数组:

Array (
 [0] => stdClass Object ( [ID] => 113 [title] => text )
 [1] => stdClass Object ( [ID] => 114 [title] => text text text )
 [2] => stdClass Object ( [ID] => 115 [title] => text text )
 [3] => stdClass Object ( [ID] => 116 [title] => text )
)

想要分两步更新它:

  • 获取每个对象的[ID]并将其值传递到位置计数器(我指的是[0]、[1]、[2]、[3]
  • 传递后删除[ID]

最终,更新后的数组($new_var)应该是这样的:

Array (
 [113] => stdClass Object ( [title] => text )
 [114] => stdClass Object ( [title] => text text text )
 [115] => stdClass Object ( [title] => text text )
 [116] => stdClass Object ( [title] => text )
)

如何做到这一点?

谢谢。

2个回答

20
$new_array = array();
foreach ($var as $object)
{
  $temp_object = clone $object;
  unset($temp_object->id);
  $new_array[$object->id] = $temp_object;
}

我假设您的对象中有更多内容,而您只想删除ID。如果您只需要标题,您无需克隆该对象,只需设置$new_array[$object->id] = $object->title


0

迭代对象数组并使用列数据填充具有所需结构的新对象数组。我手动将减少的有效载荷(包含单个属性)强制转换为对象。

代码:(演示)

$result = [];
foreach ($array as $obj) {
    $result[$obj->ID] = (object) ['title' => $obj->title];
}
var_export($result);

或者保留id列的值,从对象中取消该属性,然后推送对象的变异版本。

但是要小心使用此选项,因为在foreach()中对象会修改原始值! (演示)

$result = [];
foreach ($array as $obj) {
    $id = $obj->ID;
    unset($obj->ID);
    $result[$id] = $obj;
}
var_export($result);

echo "\n---\n";

var_export($array);  // <-- notice how the original array has lost its id properties

@DanielVandersluis的答案没有受到原始数组的变异。证明:https://3v4l.org/1ggB6


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接