【问题标题】:Remove item from array if value equals如果值等于,则从数组中删除项目
【发布时间】:2019-01-30 08:15:59
【问题描述】:

在 Woocommerce 订单页面上,我有订单中的项目,我想通过这些项目循环并排除特定项目按产品 ID

$order->get_order_number();
$items = $order->get_items();

foreach( $items as $key => $value) :
     $exclude = $value->get_product_id();
     if( in_array($exclude, array('3404') ) {  
        unset($items[$key]);
     }
  }
endforeach;

$new_items = array_values($items);

我认为这会遍历原始数组,删除 $item$product_id == 3404 然后重新索引。

我在这里运气不好。有什么想法吗?

已解决 ->

        //Filter out colon cleanse duo
    $items = array_filter($order->get_items(), function($item) {
        return $item->get_product_id() != 3404;
    });

    //Randomize ids and grab one
    shuffle($items);
    foreach( $items as $item) :

        $product_id = $item->get_product_id();
        $product_name = $item->get_name();

        break;
    endforeach;

【问题讨论】:

  • 如果您只需要一个,您应该在设置$product_name 后将foreach 留给break;。否则,您一次又一次地遍历所有项目,并获得最后一个条目。
  • 哦,就这样? foreach( $items as $item) : $product_id = $item->get_product_id(); $product_name = $item->get_name();休息; endforeach;
  • 没错。这将节省“一些性能”。
  • 太棒了。我不是开发人员,所以这很棒。我应该查看所有其他自定义函数,看看我是否做了同样的事情。非常感谢,马库斯!

标签: php arrays woocommerce orders unset


【解决方案1】:

你应该可以这样做:

$items = array_filter($order->get_items(), function($item) {
    return $item->get_product_id() != 3404;
});

这将遍历$items 并像foreach 一样将每个值传递给$item。如果array_filter 的回调返回true,则该值将被保留,否则将被丢弃。

您甚至可以直接传入$order->get_items(),而无需将项目提取到数组中。

此外,如果您需要排除多个,如您的评论中所要求的,您可以这样做:

$items = array_filter($order->get_items(), function($item) {
    return !in_array($item->get_product_id(), [3404, 6890]);
});

【讨论】:

  • 嗨,马库斯。感谢您的回复!我收到一条错误消息,告诉我 array_filter 期望参数 1 是一个数组。有什么想法吗?
  • 嘿马库斯。我希望您可以帮助协助添加此内容:如果我想排除 id 3404 和 id 6890,看起来 != array( 3404, 6890 ) 不起作用; != ( 6890 || 3404 ) 也没有。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-09
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 2016-11-02
  • 2021-10-19
  • 1970-01-01
相关资源
最近更新 更多