我很难完成一次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;
//}
}
}
}
}
任何解决方案?感谢。
答案 0 :(得分:1)
您的代码的主要问题是您要测试不同的代码
数组元素,但你在逐个迭代的过程中进行。代码
在for
循环内部只会看到当前元素
迭代。因此,当您嵌套if
语句时,基本上就是这样
测试当前元素是否等于某个东西,然后测试它是否相等
你是否测试这个元素是否与其他元素相同。这个
逻辑会失败。
因为显然只有option
和value
键是重要的,所以我
建议先创建另一个数组。然后,您可以访问
所有这些属性一次 - 而不仅仅是当前属性
在迭代器中。例如,这是一个简化的属性数组
对于你在问题中的最后一个例子:
$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)
// 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;
}
}
}
}
}