【问题标题】:Foreach multiple variablesForeach 多个变量
【发布时间】:2020-05-19 08:06:38
【问题描述】:

我使用 PHP 变量 $sku 从导出中删除某些产品。如果我只想从导出中删除带有 SKU X 的产品,下面的代码效果很好。

foreach ($skus as $key => $sku){if ($sku == "X") return "";

但是,如果我想从导出中删除带有 SKU X 和/或 Y 和/或 Z 的产品,下面的代码会给出空输出。知道这里有什么问题吗?

foreach ($skus as $key => $sku){if ($sku == "X" || $sku == "Y" || $sku == "Z") return "";

更新:我已经更改了函数,但现在我收到致命错误:'continue' not in the 'loop' or 'switch' context in your code on line 32 (continue;)。

function get_order_item_lines($skus = '', $qty = ''){
    
    $xml = '';
    if (!empty($skus) && is_array($skus)){
        
        foreach ($skus as $key => $sku){
            if (strpos(strtoupper($sku, "Z")) === 0) return "";
            $xml .= "<L>".PHP_EOL;
            $xml .= "<P>" . $sku . "</P>".PHP_EOL;
            $xml .= "<Q>" . (empty($qty[$key]) ? "" : $qty[$key]) . "</Q>".PHP_EOL;
            $xml .= "</L>".PHP_EOL;
        }

    } else {
        $skus = explode( ",", $skus );
        if ( !empty( $skus[0] ) && !empty( $qty[0] ) ) {
            if (strpos(strtoupper($skus[0], "Z")) === 0) return "";
            $xml .= "<L>".PHP_EOL;
            $xml .= "<P>" . trim( $skus[0] ) . "</P>".PHP_EOL;
            $xml .= "<Q>" . (empty($qty[0]) ? "" : $qty[0]) . "</Q>".PHP_EOL;
            $xml .= "</L>".PHP_EOL;
        }
    }

    return $xml;
}

【问题讨论】:

  • 你尝试过什么调试问题?

标签: php foreach


【解决方案1】:

注意 return ,当你的意思是继续 foreach 迭代时不要返回(离开函数)。您的代码这样做是错误的:

foreach ($skus as $key => $sku){
    $sku = strtoupper($sku);
    if ($sku == "X" || $sku == "Y" || $sku == "Z") return "";

以上返回"";当它发现 $sku 是 X、Y 或 Z 并返回 NOTHING 时,完全离开该函数。您的问题/问题表明您获得了 EMPTY 值,这正是原因。如果它找到 1 个带有 X、Y 或 Z 的 sku,它将返回。如果您只想继续,则让它继续,同时跳过 X、Y、Z skus。

foreach ($skus as $key => $sku){
  $sku = strtoupper($sku);
  if ( $sku == "X" || $sku == "Y" || $sku == "Z") {
    //ignore these skus and continue foreach
    continue;
  }

  $good_skus[] = $sku;
}

var_dump($good_skus);

【讨论】:

  • 谢谢,我在 if 和 else 语句中都添加了 strtoupper,但输出仍然为空。我已经在初始帖子中添加了完整的功能。
  • 它没有返回值的原因是你让它返回。将 return 替换为 continue
  • 感谢您的帮助。我已尝试添加您的代码,但出现致命错误。我已经更新了最初的帖子。对不起,我不是那么熟练..
【解决方案2】:

也许这可以解决问题。

function get_order_item_lines($skus = '', $qty = '')
{
    $xml = '';

    if (!empty($skus) && is_array($skus))
    {
        foreach ($skus as $key => $sku)
        {
            $skuUpper = strtoupper($sku); // change to upper
            
            if ($skuUpper != 'WANHAO-STICKER'
                && strpos($skuUpper, 'NWS-', 0) === false)  // string not contains..
            {
                $xml .= "<L>".PHP_EOL;
                $xml .= "<P>" . $sku . "</P>".PHP_EOL;
                $xml .= "<Q>" . (empty($qty[$key]) ? "" : $qty[$key]) . "</Q>".PHP_EOL;
                $xml .= "</L>".PHP_EOL;
            }
        }
    } 
    else 
    {
        $skus = explode( ",", $skus );

        if ( !empty( $skus[0] ) && !empty( $qty[0] ) ) 
        {
            $skuUpper = strtoupper($skus[0]); // change to upper
            
            if ($skuUpper != 'WANHAO-STICKER'
                && strpos($skuUpper, 'NWS-', 0) === false)
            {
                $xml .= "<L>".PHP_EOL;
                $xml .= "<P>" . trim( $skus[0] ) . "</P>".PHP_EOL;
                $xml .= "<Q>" . (empty($qty[0]) ? "" : $qty[0]) . "</Q>".PHP_EOL;
                $xml .= "</L>".PHP_EOL;
            }
        }
    }

    return $xml;
}

【讨论】:

  • 谢谢约翰,你总是拯救我的一天!
【解决方案3】:

有几种方法可以做到这一点,如果数组更复杂,您可以使用 array_filter() 并使用 in_array() 和要删除的 SKU 数组...

$filteredSkus = array_filter($skus, function ($sku) use ($skusToRemove){
    return !in_array($sku, $skusToRemove);
});

或者如果 SKU 只是数组中的值,您可以 array_diff() 使用要删除的 SKU 数组...

$difSkus = array_diff($skus, $skusToRemove);

【讨论】:

    【解决方案4】:

    与 Nigel Ren 的回答有关,我认为这是正确的,这里是你问题的一个例子:

    // remove skus X, Y, and Z
    $filteredSkus = array_filter($skus, static function($sku) {
        return !($sku === 'X' || $sku === 'Y' || $sku === 'Z')
    });
    

    如果你想过滤以这些字母开头的 sku,你需要像这样使用 strpos:

    // remove skus starting with X, Y, and Z
    $filteredSkus = array_filter($skus, static function($sku) {
        return !(
            strpos(strtoupper($sku, 'X')) === 0 ||
            strpos(strtoupper($sku, 'Y')) === 0 ||
            strpos(strtoupper($sku, 'Z')) === 0
        )
    });
    

    【讨论】:

      猜你喜欢
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2018-09-02
      相关资源
      最近更新 更多