Подсчет совпадений в массиве массивов Переполнение стека

Array
(
[0] => Array
(
[song] => More Than A Feeling
[artist] => Not Boston
[time] => 15:00
)

[1] => Array
(
[song] => More Than A Feeling
[artist] => Boston
[time] => 11:20
)
[2] => Array
(
[song] => More Than A Feeling
[artist] => Boston
[time] => 15:23
)
)

Есть массив массивов, как это. Я пытаюсь посчитать все совпадения. Сейчас я использую

array_count_values(array_column($arr, 'song'));

Это хорошо, но он считает песни, если артист не подходит. Я пытаюсь вывести следующее.

Array
(
[0] => Array
(
[song] => More Than A Feeling
[artist] => Not Boston
[count] => 1
)

[1] => Array
(
[song] => More Than A Feeling
[artist] => Boston
[count] => 2
)
)

Не уверен, где начать. Спасибо за помощь!

0

Решение

Сделайте это вручную в простой петле. Я собираюсь искать через $songs массив и добавить элементы в $songCounters без дубликатов. Выход $songCounters Массив будет содержать как песни, так и счет в таком порядке, что счет будет следующим элементом песни.

[(song)(count)(song)(count)]

Вот код:

//Here is your input array
$songs = array(0 => array('song' => 'More Than A Feeling', 'artist' => 'Not Boston', 'time' => 0),
1 => array('song' => 'More Than A Feeling', 'artist' => 'Boston', 'time' => 0),
2 => array('song' => 'More Than A Feeling', 'artist' => 'Boston', 'time' => 0));$songCounters = array();    //Initialize the output array//Now lets go through the input array
foreach($songs as $song) {

//Prepare the current song
$currentSong = array('song' => $song['song'], 'artist' => $song['artist']);//Get the index of the current song from $songCounters
$index = array_search($currentSong, $songCounters);

//Insert if not found
if ($index == false) {
array_push($songCounters, $currentSong);
array_push($songCounters, 1);       //Next element is the counter
}
else {
$songCounters[$index + 1]++;    //Increase the counter if found
}

}

print_r($songCounters);

Вот php играть на скрипке.

0

Другие решения

Нашел ответ на другой вопрос. Это сработало для меня.

$arr = array(0 => array('song' => 'More Than A Feeling', 'artist' => 'Not Boston', 'time' => 0),
1 => array('song' => 'More Than A Feeling', 'artist' => 'Boston', 'time' => 0),
2 => array('song' => 'More Than A Feeling', 'artist' => 'Boston', 'time' => 0));$hash = array();
$array_out = array();

foreach($arr as $item) {
$hash_key = $item['song'].'|'.$item['artist'];
if(!array_key_exists($hash_key, $hash)) {
$hash[$hash_key] = sizeof($array_out);
array_push($array_out, array(
'song' => $item['song'],
'artist' => $item['artist'],
'count' => 0,
));
}
$array_out[$hash[$hash_key]]['count'] += 1;

}

 var_dump($array_out);
0

По вопросам рекламы [email protected]