【问题标题】:Laravel - Removing object inside of array based on key value - array_filterLaravel - 根据键值删除数组内的对象 - 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 ) ;

    }
}

【问题讨论】:

    标签: php arrays laravel object array-filter


    【解决方案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 哦,这太糟糕了。我编辑了我的帖子以澄清我的想法。我不知道您的底层代码是如何实现的。奇怪的是它不起作用。
      猜你喜欢
      • 1970-01-01
      • 2017-12-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2019-10-26
      相关资源
      最近更新 更多