Laravel - 根据键值从数组中删除对象 - array_filter

3
我遇到了一个问题,无法在这个数组中删除一个object
首先我获取要从数组中删除的$id。 但是当我筛选数组时,它会将键附加到数组上。
因此,逻辑将不再适用于应用程序的其余部分。
在删除cart数组中的对象后,如何保持options对象的相同语法?

enter image description here

    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 ) ;

    }
}
3个回答

4

如果我理解正确,您想在执行逻辑后重新排列数组并保持结构,我建议使用array_values函数。

$new_data= array_values($data);

如果你收到“不是一个数组”的错误,尽管我觉得这种情况很少见,可以使用toArray()方法。

$new_data= array_values($data->toArray());

1

从您的JSON编码中看到,左下角的options对象是一个包含属性cart的对象,该属性是一个数组。右下角的options对象是一个包含属性cart的对象,该属性是一个对象,其中包含每个数字索引的属性。

我不确定,但我认为问题可能在于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函数无效。 - rocket_moon
@bmpf_pt 哦,太糟糕了。我已经编辑了我的帖子以澄清我的想法。我不知道你的底层代码是如何实现的。奇怪它为什么不起作用。 - S. Imp

0

看起来 (object)['cart' => $data ] 在某种程度上改变了你的数组。

直接设置属性应该可以解决问题:

$user->options->cart = $data;

此外,return json_encode($option); 除了使执行速度变慢之外,并没有任何实际效果。你可以直接 return true;

这不会改变任何东西:/ $user->options->cart = $data; - rocket_moon

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