Двойной Foreach неожиданный результат - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть два массива, оба ассоциативных;

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);

Токовый выход неожиданный.

Только последнее значение ArrayUneaten обрабатывается правильно.

Другие значения возвращают 100%.

ArrayEatenPercentage (100, 100, 100, 50, 100)

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Вы должны были добавить перерыв;в конце if ($ fruitUneaten == $ fruitOrdered) {блок условий.В противном случае, если текущий фрукт не является последним элементом (который является яблоком) в $ ArrayUneaten, $ completePercentage всегда становится равным 100, потому что на последней итерации внутренний цикл освобождения переходит в этот блок else.

1 голос
/ 30 ноября 2011

Предполагая, что все фрукты находятся в "упорядоченном" массиве, вы можете попробовать что-то вроде этого:

$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 );
}

Ваш массив результатов будет основан на фруктах и ​​будет содержать как абсолютное количество съеденного, так и процент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...