2017-07-02 73 views
-2

下面的代碼工作,並確實輸出我想要的。我做了一個foreach循環獲取特定字段的值($ CustomFields ...),它是框架變量的一部分。然後只有當條件是「組」時才計入該字段。 之後,我想het所有領域/數量的平均價格。Foreach代碼工作 - 但要求優化

// ########### Get average hourly rate for group classes 
$itemsperhour = array(); 
$countperhour = 0; 

foreach($listings as $listing) { 
    if ($CustomFields->fieldValue('jr_typeoflesson',$listing,false,false) == 'group') { 
     $itemsperhour[] = $CustomFields->field('jr_hourlyrateus',$listing,false,false); 
     $countperhour = $countperhour + 1; 
    } 
} 

//print_r($items); 

if ($countperhour > 0) { 
    $totalperhour = array_sum($itemsperhour); 
    $averageperhour =($totalperhour/$countperhour); 
    echo round($averageperhour,2); 
} else { 
    echo "No data"; 
} 

unset ($averageperhour); 

如上所述,該片段起作用。但我可以問其他人怎麼會寫出這樣優化這樣一段代碼相關的腳本(速度和可讀性 PHP 5.6+

碧玉

回答

0

我會想使用array_reduce功能得到平均:

$averageperhour = array_reduce($listings, function($average, $listing) use (&$CustomFields) 
{ 
    static $sum = 0; 
    static $counter = 0; 

    if ($CustomFields->fieldValue('jr_typeoflesson', $listing, false, false) == 'group') { 
     $sum += $CustomFields->field('jr_hourlyrateus', $listing, false, false); 
     $counter ++; 
     $average = round(($sum/$counter), 2); 
    } 

    return $average; 
}, 'No data'); 

echo $averageperhour; 

不知道有關的速度提高(需要ŧ esting),但是這個變體在我看來更像可讀性。

+0

目前還不清楚'$ listing'是'array'還是隻能迭代。 – localheinz

0

下面是優化的一種方式:

$totalperhour = 0; 
$countperhour = 0; 
foreach($listings as $listing) { 
    if ($CustomFields->fieldValue('jr_typeoflesson',$listing,false,false) == 'group') { 
     $totalperhour += $CustomFields->field('jr_hourlyrateus',$listing,false,false); 
     $countperhour = $countperhour + 1; 
    } 
} 

if($countperhour > 0) { 
    $averageperhour =($totalperhour/$countperhour); 
    echo round($averageperhour,2); 
    $averageperhour = ''; 
} else { 
    echo "No data"; 
} 
+0

希望得到迴應的理由。 –

+0

不是我,感激的答案。我仍在檢查你的想法 – Jasper

+0

好吧@Jasper。每一次倒票都應該有理由。 SO是爲了分享知識,所以每個人都在學習。努力不應低估。 –

0

這個怎麼樣?

$itemsPerHour = []; 

foreach($listings as $listing) { 
    if ($CustomFields->fieldValue('jr_typeoflesson', $listing, false, false) !== 'group') { 
     continue; 
    } 

    $itemsPerHour[] = $CustomFields->field('jr_hourlyrateus', $listing, false, false); 
} 

$countPerHour = count($itemsPerHour); 

if ($countPerHour > 0) { 
    $averagePerHour = array_sum($itemsPerHour)/$countPerHour; 

    echo round($averagePerHour,2); 
} else { 
    echo "No data"; 
}