Php 双Foreach意外结果
我有两个数组,都是关联的Php 双Foreach意外结果,php,arrays,foreach,Php,Arrays,Foreach,我有两个数组,都是关联的 ArrayUneaten ( lemon=> 7, banana=>6, apple=>10)//the units of UNeaten fruit ArrayOrdered (lemon =>10, strawberry =>10, Kiwi=>0, Apple=>20, Banana=>6) // the units of ordered fruit 我想创建第三个数组(如果与ArrayOrdered的顺序相同,则
ArrayUneaten ( lemon=> 7, banana=>6, apple=>10)//the units of UNeaten fruit
ArrayOrdered (lemon =>10, strawberry =>10, Kiwi=>0, Apple=>20, Banana=>6) // the units of ordered fruit
我想创建第三个数组(如果与ArrayOrdered的顺序相同,则可以使用数字)
所有水果的选择和食用水果的百分比(与订购的水果相比)
(注意:如果订购值为0%,则由于其他原因,%0%)
(NB2,请注意,草莓的期望百分比为100,没有未食用的草莓,订购了10个,因此已经食用了10个)
理想阵列
ArrayEatenPercentage (70, 100, 0, 50, 0)
我的编码尝试
$CompletedPercentagesArray = array ();
foreach( $ArrayOrdered as $fruitOrdered => $unitsOrdered) {
if ($unitsOrdered == 0){
//if it's zero it's never been selected
$completedPercentage = 0;
}
foreach( $ArrayUneaten as $fruitUneaten => $unitsUneaten) {
if ( $fruitUneaten == $fruitOrdered){
// ($totalCardsChosen = $timesSelected*25; - please ignore)
$percentageUneaten = 100*($fruitUneaten/$unitsOrdered);
$percentageEaten = 100 - $percentageUneaten;
$completedPercentage = round ($percentageEaten, 1);
}
else {//if this is true then it's been selected and been finished
$completedPercentage = 100;
}
}
array_push( $completedPercentagesArray, $completedPercentage ); //this adds the variable to the array
}
print_r($completedPercentagesArray);
当前输出是意外的
仅正确处理ArrayUneat的最后一个值
其他值返回100%
ArrayEatenPercentage (100, 100, 100, 50, 100)
假设所有水果都在“有序”数组中,您可以尝试以下操作:
$results = array();
foreach( $arrayOrdered as $fruit => $numOrdered ) {
if( Isset( $arrayUneaten[$fruit] ) ) {
$numEaten = $numOrdered - $arrayUneaten[$fruit];
} else {
$numEaten = $numOrdered;
}
if( $numOrdered > 0 ) {
$percentEaten = $numEaten / $numOrdered * 100;
} else {
$percentEaten = 0;
}
$results[$fruit] = array( 'eaten' => $numEaten, 'percent' => $percentEaten );
}
您的结果数组将键入水果,并包含绝对食用量和百分比。您应该添加break;在if($fruitUneaten==$fruitOrdered){条件块的末尾。否则,除非当前水果是最后一个元素(即apple)对于$ArrayUneat,$completedPercentage始终变为100,因为在内部循环执行的最后一次迭代中会转到该else块。您应该显示当前输出以及预期输出。您在代码中使用$FROUTSUNEAT,在示例中使用ARrayUneat。可能是您在co中的某个位置使用了错误的名称de.在我看来,您的代码使用的数组变量与您在示例中使用的数组变量不同。例如,
foreach($FROUTURNEATEN as$FROUTURSUNEATED=>$UNITSUNEATED)
正在使用前面代码中未提及的$FROUTURNEATEN
。同样的情况也发生在数组中($completedPercentagesArray,$completedPercentage)
您将推到$completedPercentagesArray
而不是ArrayEatenPercentage
。这是所需的行为吗?谢谢,这些只是从真实代码传输过来的输入错误(现在已更正)(否则我的输出将是未定义的变量)谢谢,尽管我使用了上面的代码,因为它是第一个通过的,并且有效。我不确定这两个代码中哪一个会更快或更稳定。