Вот мой код для достижения: Значения $categoryRatings представляют собой следующие массивы:
$categoryRatings = array:2 [
2 => array:2 [
1 => 50.0
2 => 35.0
]
3 => array:2 [
1 => 55.0
2 => 45.0
]
]
$indexes = [];
foreach ($categoryRatings as $categoryRating) {
foreach ($categoryRating as $key => $value) {
foreach ($categories as $category) {
if ($category->id == $key) {
$indexes[$category->id] = isset($indexes[$category->id]) ? ($indexes[$category->id] + $value) : $value;
}
}
}
}
$overAllCategoryRating = [];
foreach ($categories as $category) {
$overAllCategoryRating[$category->id] = $indexes[$category->id]/sizeof($categoryRatings);
}
И вывод $overallCategoryRating равен:
array:2 [
1 => 52.5
2 => 40.0
]
$categories здесь — это коллекция, в которой я использовал идентификатор в качестве ключа, чтобы я мог назначать результаты его ключу для использования в моем внешнем интерфейсе.
Есть ли способы оптимизировать этот код для эффективного использования памяти, поскольку при вычислении больших данных он не будет быстро получать результаты из-за большого количества циклов foreach.
Вы можете использовать
$first = collect($categoryRatings)->avg(1) // Result: 52.5
$second = collect($categoryRatings)->avg(2) // Result: 40.0
Привет, Хавьер, спасибо за правильный ответ. Как насчет того же самого, только трехмерного массива, на этот раз с некоторой строкой в значениях массива, так что это смесь строковых и числовых значений. массив:2 [ 2 => массив:3 [ 1 => массив:2 [ 1 => 50,0 2 => 50,0 ] 2 => массив:1 [ 3 => 35,0 ] 3 => массив:1 [ 4 => " в процессе" ] ] 3 => массив:3 [ 1 => массив:2 [ 1 => 60,0 2 => 50,0 ] 2 => массив:1 [ 3 => 45,0 ] 3 => массив:1 [ 4 = > "в процессе" ] ] ]