Каков наилучший / быстрый способ отобразить повторяющиеся значения массива и их количество в переполнении стека

Мне нужен ваш совет, если есть лучший (и более быстрый) способ вывода дублированных значений массива и их количества в php.

В настоящее время я делаю это с помощью приведенного ниже кода:

Первоначальный ввод всегда является текстовой строкой:

$text = "a,b,c,d,,,e,a,b,c,d,f,g,"; //Note the comma at the end

Затем я получаю уникальные значения массива:

$arrText = array_unique(explode(',',rtrim($text,',')));

Затем я подсчитываю повторяющиеся значения в массиве (исключая пустые):

$cntText = array_count_values(array_filter(explode(',', $text)));

И, наконец, я повторяю значения массива и их количество в цикле внутри цикла:

foreach($arrText as $text){
echo $text;
foreach($cntText as $cnt_text=>$count){
if($cnt_text == $text){
echo " (".$count.")";
}
}

Мне интересно, есть ли лучший способ вывести уникальные значения и их количество без использования цикла внутри цикла.

В настоящее время я выбрал этот подход, потому что:

  1. Мой ввод всегда текстовая строка
  2. Текстовая строка содержит пустые значения и имеет запятую в конце
  3. Мне нужно отображать только непустые значения

Дайте мне знать ваши советы экспертов!

0

Решение

Вы можете написать свой код для печати значений намного короче (также я написал другие вещи немного короче):

Вам не нужно rtrim() или же array_unique()Вам нужно только explode() и с array_filter() Вы заботитесь о пустых значениях. Тогда просто используйте array_count_values() и цикл по значениям.

<?php

$text = "a,b,c,d,,,e,a,b,c,d,f,g,";
$filtered = array_filter(explode(",", $text));
$countes = array_count_values($filtered);

foreach($countes as $k => $v)
echo "$k ($v)";

?>

выход:

a (2)b (2)c (2)d (2)e (1)f (1)g (1)
1

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

Вам не нужно создавать два массива как array_count_values ключи — это значение текста.

$myArray = array_count_values(array_filter(explode(',',$text)));
foreach($myArray as $key => $value){
echo $key . ' (' . $value . ')';
}
1

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