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的主要内容,如果未能解决你的问题,请参考以下文章

javascript 删除对象内的键值对

如何使用 php/laravel 在现有数组对象中插入键值对?

localStorage

根据其键值之一删除 CNContact 数组

删除嵌套数组中具有键值的对象

JavaScript:检查对象数组中是不是存在重复的键值并删除所有但最近添加的具有该键值的对象