1

这让我发疯了。我已经验证了我的输入/输出,但仍然出现意外行为。它应该是 2,但它正在做 numa numa。我错过了什么?

输入:

data
Array
(
    [0] => Array
        (
            [lineId] => 1
            [quantity] => 2
            [costPerItem] => 16.585
            [itemId] => 1
        )

)

代码:

printr( $data, 'data' );
foreach( $data as $i => $value ){
    foreach( $value as $key => $a ){
        echo 'key: '.$key.' - a: '.$a.'<br />';
        ( $key == 'quantity' ) ? $dataQuantity[$i] = $a : $dataQuantity[$i] = 'numanuma'; 
    }
}
printr( $dataQuantity, 'data quantity' );

输出:

key: lineId - a: 1
key: quantity - a: 2
key: costPerItem - a: 16.585
key: itemId - a: 1

data quantity
Array
(
    [0] => numanuma
)
4

4 回答 4

3

这是因为键 itemId 在数量键之后。所以它被设置为 2 但它被设置为 numanuma 之后的循环。

试试这个:

printr( $data, 'data' );
foreach( $data as $i => $value ){
    foreach( $value as $key => $a ){
        echo 'key: '.$key.' - a: '.$a.'<br />';
        if( $key == 'quantity' )
        { 
            $dataQuantity[$i] = $a; 
        } 
    }
}
printr( $dataQuantity, 'data quantity' );
于 2013-02-12T18:34:19.770 回答
2

如果键不是“数量”,则分配“numanuma”。在“数量”键之后,一些键不是数量,因此“numanuma”被分配到 的值之上$a

简短的回答,在分配“numanuma”之前添加一个额外的检查和一个标志来检查是否$dataQuantity[$i]已经正确分配。

于 2013-02-12T18:34:13.860 回答
2

这有几个问题。

首先,您$dataQuantity[$i]在子循环中设置值,但$i在外部循环中递增。

当您的代码看到“数量”时,它可能会设置$dataQuantity[$i]2,但随后它会看到itemId并覆盖$dataQuantity[$i],因为$i没有改变。

其次,您应该将您的三元 if 语句更改为:

$dataQuantity[$i] = ( $key == 'quantity' ) ? $a : 'numanuma';

这并不影响我之前提到的

这是一个工作示例:

printr( $data, 'data' );
foreach( $data as $i => $value ){
    foreach( $value as $key => $a ){
        if ($key == 'quantity') {
            $dataQuantity[$i] = $a;
            break;
        }
    }
}
printr( $dataQuantity, 'data quantity' );
于 2013-02-12T18:35:34.267 回答
0

三元运算符不用于赋值,请阅读:

注意:请注意,三元运算符是一个语句,它的计算结果不是变量,而是语句的结果。了解是否要通过引用返回变量很重要。语句 return $var == 42 ?$a : $b; 因此,在按引用返回的函数中将不起作用,并且在以后的 PHP 版本中会发出警告。

来源

于 2013-02-12T18:35:24.470 回答