Laravel - 根据键值删除数组内的对象 - array_filter
Posted
技术标签:
【中文标题】Laravel - 根据键值删除数组内的对象 - array_filter【英文标题】:Laravel - Removing object inside of array based on key value - array_filter 【发布时间】:2019-11-19 02:04:44 【问题描述】:我无法删除此 array
中的 object
。
首先我得到要从数组中删除的$id
。
但是当我过滤时,将数组添加到它的附加键。
所以逻辑将不再适用于应用程序的其余部分。
删除cart
数组中的对象后,如何在options
对象上保持相同的语法?
public function destroy( $id, Request $request )
$user = $this->user ;
$data = array_filter( $user->options->cart , function ( $option ) use ( $id )
if ( $option->product_id == $id )
return false;
return json_encode($option);
);
//dd($user->options->cart);
//dd($data);
$user->options = (object)['cart' => $data ];
$user->save() ;
return response()->json( $user , 200 ) ;
已解决:
public function destroy( $id, Request $request )
$user = $this->user ;
$data = array_filter( $user->options->cart , function ( $option ) use ( $id )
if ( $option->product_id == $id )
return false;
return true;
);
$user->options = ['cart' => array_values( $data ) ];
$user->save() ;
return response()->json( $user , 200 ) ;
【问题讨论】:
【参考方案1】:如果我理解你的话,你想在你做你的逻辑并保持结构之后重新排列数组,我建议你使用 array_values
$new_data= array_values($data);
如果你得到一个错误,它不是一个数组,虽然我怀疑只使用 toArray() 方法
$new_data= array_values($data->toArray());
【讨论】:
【参考方案2】:似乎(object)['cart' => $data ]
正在以某种方式更改您的数组。
直接设置属性应该可以:
$user->options->cart = $data;
另外,return json_encode($option);
除了使执行变慢之外没有任何实际效果。你可以return true;
。
【讨论】:
这并没有改变任何东西:/$user->options->cart = $data;
【参考方案3】:
查看您的 JSON 编码,我看到左下方的 options 对象是一个包含属性 cart 的对象,该属性是一个数组。右下角的 options 对象是一个包含属性 cart 的对象,该属性是一个 object,其中包含每个数字索引的属性.
我完全不确定,但我认为问题可能在于array_filter 函数保留了数组键:
如果回调函数返回 TRUE,则将数组中的当前值返回到结果数组中。数组键被保留。
我建议您尝试使用一些不尝试保留数组键的方法,以便过滤后的数组具有连续的数值。
public function destroy( $id, Request $request )
foreach($this->user->options->cart as $key => $cart_item)
if ($cart_item->product_id == $id)
unset($this->user->options->cart[$key]);
$user->save() ;
return response()->json( $user , 200 ) ;
编辑:我不知道您的实现细节(我不知道 $user 是什么类型的对象或 $user->save 或 $response->json() 可能会做什么)但这段代码会按 product_id 删除数组元素:
$arr = array(
(object)["product_id" => 819, "name" => "I am 819"],
(object)["product_id" => 820, "name" => "I am 820"],
(object)["product_id" => 821, "name" => "I am 821"],
(object)["product_id" => 822, "name" => "I am 822"]
);
foreach($arr as $key => $v)
if ($v->product_id == 820)
unset($arr[$key]);
var_dump($arr);
【讨论】:
此解决方案不起作用。$this->user->options->cart
的数据是一样的。什么都没有被删除。在这种情况下,unset 函数不会做任何事情。
@bmpf_pt 哦,这太糟糕了。我编辑了我的帖子以澄清我的想法。我不知道您的底层代码是如何实现的。奇怪的是它不起作用。以上是关于Laravel - 根据键值删除数组内的对象 - array_filter的主要内容,如果未能解决你的问题,请参考以下文章