Функциональный подход без условий: (* 1001 * Демо )
$season_data = [
'Paul' => [
'Season' => [2014, 2015, 2016]
],
'John' => [
'Season' => [2012]
]
];
$appearance_data = [
'Paul' => [
'Appearance'=> [
2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2015, 2015, 2015
]
],
'John' => [
'Appearance' => [
2012, 2012, 2012, 2012
]
]
];
foreach ($season_data as $person => $data) {
$defaults = array_fill_keys($data['Season'], 0);
$result[$person]['SeasonCounts'] = array_replace(
$defaults,
array_intersect_key(
array_count_values($appearance_data[$person]['Appearance']),
$defaults
)
);
}
var_export($result);
Выход:
array (
'Paul' =>
array (
'SeasonCounts' =>
array (
2014 => 8,
2015 => 3,
2016 => 0,
),
),
'John' =>
array (
'SeasonCounts' =>
array (
2012 => 4,
),
),
)
Использование функций для этой задачи поясняет выполняемые задачи - делает код легко понятным для будущих разработчиков.
- Для каждого человека я временно сохраняю нужные годы с нулевым значением.
- Затем я вызываю
array_count_values()
, чтобы быстро сгенерировать массив годов появления и их количества (это именно та задача, для которой была создана функция).
- Затем отфильтруйте массив, чтобы сохранить только годы, назначенные в массиве сезона человека, с помощью
array_intersect_key()
.
- Наконец, замените все нули на их новые соответствующие значения счетчиков через
array_replace()
.
В качестве небольшой модификации вышеприведенного, вы можете отфильтровать до , считая так: Демо .
Всего четыре функционально чистых, читаемых вызова функции на человека для достижения точного желаемого результата.
Мой массив результатов спроектирован с ассоциативными SeasonCounts
подмассивами, потому что данные буквально ассоциативны. Сохранение выходных данных с индексированными счетами ослабляет взаимосвязь - этот подход можно избежать с помощью моего подхода.
В качестве альтернативы, вы можете сделать повторный фильтр и подсчитать количество вызовов для каждого случая сезона для каждого человека. ( Тот же результат )
foreach ($season_data as $person => $data) {
foreach ($data['Season'] as $year) {
$result[$person]['SeasonCounts'][$year] = sizeof(
array_filter(
$appearance_data[ $person]['Appearance'],
function($v) use ($year) {
return $v == $year;
})
);
}
}
Наконец, бесполезный, условно возрастающий подход. ( Тот же результат )
foreach ($season_data as $person => $data) {
foreach ($data['Season'] as $year) {
$result[$person]['SeasonCounts'][$year] = 0;
foreach ($appearance_data[$person]['Appearance'] as $appearance) {
if ($appearance == $year) {
++$result[$person]['SeasonCounts'][$year];
}
}
}
}