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
。这是所需的行为吗?谢谢,这些只是从真实代码传输过来的输入错误(现在已更正)(否则我的输出将是未定义的变量)谢谢,尽管我使用了上面的代码,因为它是第一个通过的,并且有效。我不确定这两个代码中哪一个会更快或更稳定。