PHP数组:for语句中的两次if语句

时间:2017-01-05 13:07:06

标签: php arrays multidimensional-array oscommerce

我很难完成一次if语句两次..其余的工作正常但是当我尝试检查另一个子数组时它不起作用。

修改 - 第一个if条件是检查产品类型 - 第二个if条件是检查大小属性。 - 产品:sweatshirt_crianca和sweatshirtc_crianca_capuz - 尺寸:4_anos,6_anos,8_anos,11_anos,12_anos和14_anos 需要禁用($ this-> enabled = false;)除14_anos外的那些尺寸。

这是我从 $ order->产品获得的[$ i]

Array
(
    [qty] => 1
    [name] => .Mr Mickey T-shirt
    [model] => 
    [image] => blusa-mr-mrs-blusao-sweat-camisolas-portugal.png
    [tax] => 20
    [tax_description] => IVA 23%
    [price] => 10.8333
    [final_price] => 16.6666
    [weight] => 0.00
    [id] => 1342{18}135{17}132{19}148
    [attributes] => Array
        (
            [0] => Array
                (
                    [option] => s_cor_produto
                    [value] => branco
                    [option_id] => 18
                    [value_id] => 135
                    [prefix] => +
                    [price] => 0.0000
                )

            [1] => Array
                (
                    [option] => s_produto
                    [value] => sweatshirt_crianca
                    [option_id] => 17
                    [value_id] => 132
                    [prefix] => +
                    [price] => 5.8333
                )

            [2] => Array
                (
                    [option] => s_tamanho_produto
                    [value] => 8_anos
                    [option_id] => 19
                    [value_id] => 148
                    [prefix] => +
                    [price] => 0.0000
                )

        )

)
Array
(
    [qty] => 1
    [name] => Adivinha quem vai ser mama shirt
    [model] => 
    [image] => adivinha-quem-vai-ser-mama-tshirt-gravida.png
    [tax] => 20
    [tax_description] => IVA 23%
    [price] => 10.8333
    [final_price] => 10.8333
    [weight] => 0.00
    [id] => 1860{20}157{18}139{17}128{19}152
    [attributes] => Array
        (
            [0] => Array
                (
                    [option] => s_cor_impressao
                    [value] => branco
                    [option_id] => 20
                    [value_id] => 157
                    [prefix] => +
                    [price] => 0.0000
                )

            [1] => Array
                (
                    [option] => s_cor_produto
                    [value] => azul_royal
                    [option_id] => 18
                    [value_id] => 139
                    [prefix] => +
                    [price] => 0.0000
                )

            [2] => Array
                (
                    [option] => s_produto
                    [value] => tshirt_mulher
                    [option_id] => 17
                    [value_id] => 128
                    [prefix] => +
                    [price] => 0.0000
                )

            [3] => Array
                (
                    [option] => s_tamanho_produto
                    [value] => M
                    [option_id] => 19
                    [value_id] => 152
                    [prefix] => +
                    [price] => 0.0000
                )

        )

)

有时它可以包含1或4个子阵列。这是来自osCommerce的鳕鱼支付,我试图根据它的属性从这种方法中排除特定产品。 这在第一个if语句中可以正常工作来检查[value]但是注释语法的行是正确的但它不起作用。这是我得到的代码:

  for ($i=0, $n=sizeof($order->products); $i<$n; $i++) {
    if ($order->products[$i]['weight'] > '0.00') {
      $this->enabled = false;
    }
    if ( (isset($order->products[$i]['attributes'])) && (sizeof($order->products[$i]['attributes']) > 0) ) {
      for ($j=0, $n2=sizeof($order->products[$i]['attributes']); $j<$n2; $j++) {
        if ( ($order->products[$i]['attributes'][$j]['option'] == 's_produto') && ($order->products[$i]['attributes'][$j]['value'] == 'sweatshirt_crianca') ) {
          //if ( ($order->products[$i]['attributes'][$j]['option'] == 's_tamanho_produto') && ($order->products[$i]['attributes'][$j]['value'] == '14_anos') ) {
            $this->enabled = false;
          //}
        }
        else if ( ($order->products[$i]['attributes'][$j]['option'] == 's_produto') && ($order->products[$i]['attributes'][$j]['value'] == 'sweatshirtc_crianca_capuz') ) {
          //if ( ($order->products[$i]['attributes'][$j]['option'] == 's_tamanho_produto') && ($order->products[$i]['attributes'][$j]['value'] != '14_anos') ) {
            $this->enabled = false;
          //}
        }
      }
    }
  }

任何解决方案?感谢。

3 个答案:

答案 0 :(得分:1)

您的代码的主要问题是您要测试不同的代码 数组元素,但你在逐个迭代的过程中进行。代码 在for循环内部只会看到当前元素 迭代。因此,当您嵌套if语句时,基本上就是这样 测试当前元素是否等于某个东西,然后测试它是否相等 你是否测试这个元素是否与其他元素相同。这个 逻辑会失败。

因为显然只有optionvalue键是重要的,所以我 建议先创建另一个数组。然后,您可以访问 所有这些属性一次 - 而不仅仅是当前属性 在迭代器中。例如,这是一个简化的属性数组 对于你在问题中的最后一个例子:

$attributes = [
    s_cor_impressao   => 'branco'
    s_cor_produto     => 'azul_royal'
    s_produto         => 'tshirt_mulher'
    s_tamanho_produto => 'M'
];

为了轻松创建这个并简化代码,我建议使用 foreach ... as循环。此外,您不需要检查是否 数组有项目。如果没有项目,只需foreach即可 执行完全。如果你设置的话,值得检查一下 事先不知道。但另一种方法是直接跳到 如果未使用continue控件设置,则进行下一次迭代 结构

foreach ($order->products as $product) {
    if ($product['weight'] > 0)
        $this->enabled = false;

    if (!isset($product['attributes']) || !is_array($product['attributes']))
        continue;

    $attributes = [];
    foreach ($products['attributes'] as $attr)
        $attributes[ $attr['option'] ] = $attr['value'];

    # [tests]
}

现在,在上面的测试标记中,您可以执行以下测试:

if ($attr['s_produto'] == 'sweatshirt_crianca' &&
    $attr['s_tamanho_produto'] == '14_anos') {
    # do something
    # $this->enabled = false;
} else if (...) {
    # do something else
}

答案 1 :(得分:0)

Sidyll打败了我,但我正在思考类似的问题:

  // loop through each product
  foreach ( $order->products as $prod )
  {

        if($prod['weight'] > '0.00')
        {
                $this->enabled = false;
        }

        if( isset($prod['attributes']) && is_array($prod['attributes']) )
        {
                $matching_product_type_found = false;
                $matching_valid_size_found = false;

                foreach ( $prod['attributes'] as $attr )
                 {
                       if ( $attr['option'] == 's_produto' &&
                            ( $attr['value'] == 'sweatshirt_crianca' ||
                              $attr['value'] == 'sweatshirtc_crianca_capuz'
                            ) )
                          {
                            $matching_product_type_found = true;
                          }

                       if ( $attr['option'] == 's_tamanho_produto' && $attr['value'] == '14_anos' )
                          {
                            $matching_valid_size_found = true;
                          }
                 }


                if( $matching_product_type_found == true )
                {

                     $this->enabled = $matching_valid_size_found;

                }

        }

  }

答案 2 :(得分:0)

我会使用foreach重写你的循环,使其更具可读性,并且更容易出错。另外,请注意您的比较(=====)。以这种方式尝试:

foreach ($order->products as $product) {
    if ($product['weight'] > 0.00) {
        $this->enabled = false;
    }
    if (!empty($product['attributes'])) {
        foreach ($product['attributes'] as $attribute) {

            if ($attribute['option'] === 's_produto') {

                switch ($attribute['value']) {
                    case "sweatshirt_crianca" :
                        // .. do some code
                        break;
                    case "s_tamanho_produto" :
                        // .. do some code
                        break;
                    case "14_anos" :
                        // .. do some code
                        break;
                    case "something else" :
                        // .. do some code
                        break;
                    default:
                        break;
                }

            }
        }
    }
}