Подсчет уникальных значений при построении массива уникальных значений

#php #foreach #count

#php #foreach #подсчет

Вопрос:

У меня есть следующий цикл foreach, который возвращает уникальные имена пользователей.

 $my_array = array();
foreach ( $log->results as $entry ) {

        $unData = unserialize( $entry ->data );

        $ref_id = $entry ->ref_id;
        $ref_nick = get_user_meta( $ref_id, 'nickname', true );

    if ( in_array($ref_nick, $my_array) ) {
        continue;
    } 
    $my_array[] = $ref_nick;
    echo $ref_nick;
}
 

Я хотел бы посчитать имена пользователей, чтобы в конечном итоге я мог создавать HTML-шаблон, например:

Имя пользователя ПОДСЧЕТ
Алиса 22
Боб 10
Чарли 7

Сначала я попытался создать другой цикл foreach, который использует $my_array , а не echo, но это кажется неэффективным.

Я пробовал что-то вроде:

     if ( in_array($ref_nick, $my_array) ) {
        count  ;
        continue;
    } 
 

но, используя это, я не уверен, как я могу добавить значения в массив, который хотел бы, как

 array(
    Alice => 22,
    Bob => 10,
    Charlie => 7
)
 

Я думаю, мне нужно построить массив таким образом, чтобы я мог снова выполнить цикл, но в порядке наибольшего количества сначала в шаблоне HTML.

Ответ №1:

Один из вариантов — создать $my_array вот так:

 $my_array = array();
foreach ( $log->results as $entry ) {

        $unData = unserialize( $entry ->data );

        $ref_id = $entry ->ref_id;
        $ref_nick = get_user_meta( $ref_id, 'nickname', true );
   
    if ( array_key_exists($ref_nick, $my_array) ) {
        //nick already exists in array, so add  1 to existing value
            $my_array[$ref_nick] = $my_array[$ref_nick]  1;
        } 
    else { 
        //add new nick to array and set value 1
        $my_array[$ref_nick] = 1;
    }
}
//Sort descending: 
arsort($my_array);

//Finally loop again and build your HTML:
foreach($my_array as $nick => $count) {
   echo '<tr><td>'.$nick.'</td></td>'.$count.'</td></tr>';
}
 

Комментарии:

1. когда я дамп my_array, я получаю { [«Alice»]=> int(1) [«Bob»]=> int(1)}, поэтому записываю только 1, а не правильное число pastebin.pl/view/c09d2acf

2. это последнее array_key_exists редактирование сделало это. Спасибо.

3. Обновлен ответ. Вместо rsort() (сортировка по ключам) должна быть arsort() (сортировка по значениям)