count — Посчитать количество элементов массива или количество свойств объекта


count

int count ( mixed $var [, int $mode = COUNT_NORMAL ] ) count возвращает количество элементов массива $var, единицу, если $var не является массивом или ноль, если $var===null. Необязательный парамемтр $mode, если принимает значение COUNT_RECURSIVE (или 1) считает рекурсивно количество всех элементов всех массивов, входящих в $var. Примеры использования: =array( ‘a’ , ‘b’ , ‘c’ , ‘d’ );
echo count ( $arr ); // 4

$arr2 =array(array( ‘a’ , ‘b’ , ‘c’ ), array( ‘d’ , ‘e’ , ‘f’ , array( ‘g’ , ‘h’ )));
echo count ( $arr2 ); // 2
echo count ( $arr2 , COUNT_RECURSIVE ); // 11

Count — Посчитать количество элементов массива или количество свойств объекта

(PHP 3, PHP 4 , PHP 5)

count — Посчитать количество элементов массива или количество свойств объекта

Описание int count ( mixed var [, int mode] )

Возвратить количество элементов переменной var , которая обычно является array , или любым другим объектом, который может содержать хотя бы один элемент.

Если var не является объектом или массивом, будет возвращена 1 . За одним исключением: если var — NULL , то будет возвращён 0 .

Замечание: Дополнительный параметр mode был добавлен начиная с PHP 4.2.0.

Если дополнительный параметр mode установлен в COUNT_RECURSIVE (или 1), count() будет считать количество элементов массива рекурсивно. Это особенно полезно для подсчёта всех элементов многомерных массивов. Предустановленное значение параметра mode — 0 . count() не обнаруживает бесконечную рекурсию.

count() может возвратить 0 для переменных, которые не установлены, но также может возвратить 0 для переменных, которые инициализированы пустым массивом. Используйте функцию isset() для того, чтобы протестировать, установлена ли переменная.

Пример 1. Пример использования count()

[ 0 ] = 1 ;
$a [ 1 ] = 3 ;
$a [ 2 ] = 5 ;
$result = count ( $a );
// $result == 3

$b [ 0 ] = 7 ;
$b [ 5 ] = 9 ;
$b [ 10 ] = 11 ;
$result = count ( $b );
// $result == 3;

$result = count ( null );
// $result == 0;

$result = count ( false );
// $result == 1;

$obj = new StdClass ;
$obj -> foo = ‘A property’ ;
$obj -> bar = ‘Another property’ ;
$result = count ( $obj );
// $result == 2;
?>

Пример 2. Пример рекурсивного использования count() (PHP >= 4.2.0)

= array( ‘fruits’ => array( ‘orange’ , ‘banana’ , ‘apple’ ),
‘veggie’ => array( ‘carrot’ , ‘collard’ , ‘pea’ ));

// рекурсивный count
echo count ( $food , COUNT_RECURSIVE ); // output 8

// обычный count
echo count ( $food ); // output 2

While michael at htmlland dot net’s code works, I believe it is better to use:
$extension=substr($file,strrpos($file,».»)+1);

This doesn’t incur the overhead of array handling. I haven’t tested it for time functions, but it should work just as well and SHOULD be faster.

If you want to count only elements in the second level of 2D arrays.A close to mind note, useful for multidimentional arrays:

= array( ‘fruits’ => array( ‘orange’ , ‘banana’ , ‘apple’ ),
‘veggie’ => array( ‘carrot’ , ‘collard’ , ‘pea’ ));

// recursive count
echo count ( $food , COUNT_RECURSIVE ); // output 8

// normal count
echo count ( $food ); // output 2

// all the fruits and veggies
echo ( count ( $food , COUNT_RECURSIVE )- count ( $food , 0 )); //output 6
?>

This is an obvious note, but I am writing it any way so other, who did may not have observed this, can take advantage of it too.

When running loops with count conditions, the code runs faster if you first assign the count() value to a variable and use that (instead of using count() directly in a loop condition.

To explain my point better, here is an example:

for ( $i = 0 ; $i 10000 ; $i ++) <
$arr [] = $i ;
>

$time11 = microtime_float ();
$bf = «» ;
for ( $i = 0 ; $i count ( $arr ); $i ++) <
$bf .= $arr [ $i ]. «\n» ;
>
$time12 = microtime_float ();
$time1 = $time12 — $time11 ;

print «First: » . $time1 . «\n» ;

$time21 = microtime_float ();
$l = count ( $arr );
for ( $i = 0 ; $i $l ; $i ++) <
$bf .= $arr [ $i ]. «\n» ;
>
$time22 = microtime_float ();
$time2 = $time22 — $time21 ;

print «Second: » . $time2 . «\n» ;

?>

The output from the code above is (when run many times):

First: 0.13001585006714
Second: 0.099159002304077

First: 0.12128901481628
Second: 0.079941987991333

First: 0.18690299987793
Second: 0.13346600532532

As you can see, the second method (which doesnt use count() directly in the loop) is faster than the first method (which uses count() directly in the loop).

BTW: I copied the microtime_float() function from one of the comments in the microtime() section. It just returns time with microseconds as float. Check comments in microtime() for more info.

This returns the filename extention as jpg not wav.

One way to change this is to use count() :
example:
$filename=»bob.jpg.wav»;
$bits= explode(«.»,$filename);
$extention= $bits[count($bits) — 1];
if($extention == «jpg»)

This returns the filename extention as wav not jpg.

As an addition, any of the array manipulation functions can likewise get count to once again return 0:

= array();
print( count ( $a )); // prints 0
$a [ 0 ] = «foo» ;
array_shift ( $a );
print( count ( $a )); //prints 0
$a [ 0 ] = «bar» ;
array_splice ( $a , 0 , 1 );
print( count ( $a )); //prints 0
?>

Note:
print (strlen($a)); // will print 0
$a=»»;
print (strlen($a)); // will print 1
$a=null;
print (strlen($a)); // will print 1
$a=array();
print (strlen($a)); // will print 0

you can only get an array back to size 0 by using the array() command, not by just setting it to «» or null.

Reminder for using count():

= array( null , «a» , «b» , null );
echo count ( $ary ); // count: 4

$ary [ 10 ] = «c» ;
echo count ( $ary ); // count: 5

$ary [ 15 ] = null ;
echo count ( $ary ); // count: 6
?>

=> NULL is seen as an element in count()

= array(array( «a» , «b» ) , array(), «v» );

echo count ( $a2Dary ); // count: 3
echo count ( $a2Dary [ 0 ]); //count 2
echo count ( $a2Dary [ 1 ]); // count: 0
echo count ( $a2Dary [ 2 ]); // count: 1
?>

Hope can help you

Counting a multi-dimentional array

[ 0 ][ 0 ] = 128 ;
$settings [ 0 ][ 1 ] = 256 ;
$settings [ 0 ][ 2 ] = 384 ;
$settings [ 0 ][ 3 ] = 512 ;
$settings [ 0 ][ 4 ] = 1024 ;
$settings [ 0 ][ 5 ] = 2048 ;

$settings [ 1 ][ 0 ] = 1024 ;
$settings [ 1 ][ 1 ] = 2048 ;
$settings [ 1 ][ 2 ] = 3072 ;
$settings [ 1 ][ 3 ] = 4096 ;

count ( $settings ) // returns 2
count ( $settings [ 0 ]) // returns 6
count ( $settings [ 1 ]) // returns 4
?>

Someone said you couldn’t use the for loop and count array command for processing arrays with missing entries.

Well, heres my working idea:

// Set up the array
$holes = array ( «first» , 2 => «second» , 5 => «fifth» , «sixth» );
// Note blank entries 3 and 4

//count number of entries, this time its 4
$array_count = count ( $holes );
for( $y = 0 ; $y $array_count ; $y ++) <
if(isset( $holes [ $y ])) <
echo( $holes [ $y ]);
>
else < $array_count ++; >
>
// In the middle, check where array entry exists
// If not, then increase the size of array_count
// to reflect gaps in array.

Here’s how to count non-empty elements
in an array of any dimension. Hope
it will be useful for somebody.

// recursively count all non-empty elements
// in array of any dimension or mixed — i.e.
// array(‘1’ => 2, ‘2’ => array(‘1’ => 3, ‘2’ => 4))
function count_all ( $arg )
<
// skip if argument is empty
if ( $arg ) <
// not an array, return 1 (base case)
if(! is_array ( $arg ))
return 1 ;
// else call recursively for all elements $arg
foreach( $arg as $key => $val )
$count += count_all ( $val );

The count function does not ignore null values in an array. To achieve this use this function.

function xcount ( $array ) <
while (list( $key , $value ) = each ( $array )) <
if ( $value ) <
$count ++;
>
>
return $count ;
>
?>

This is taken from sganer@expio.co.nz comments on the sizeof() function:
If some elements in your array are not set, then sizeof() and count() will not return the index of the last element, but will return the number of set elements. To find the index of the last element in the array:

end($yourArray);
$index = key($yourArray);

. Where $yourArray is the array you want to find the last index ($index) of.

Be careful of recasting your variables, especially with database array returns:

= mysql_query ( «select * from blah» ) // a query that returns an empty set
$row = mysql_fetch_array ( $res ); // get’s 0 since there’s no return
echo count ( $row ); // echos 1 — since $row is not an array
echo $row [ 0 ]; // echos «», but casts $row as an array?
echo count ( $row ); // echos 0 now
?>

Count функция пример

Сегодня давайте попробуем разобраться на примерах — что такое функция count. Мы не пишем учебник. Поэтому и не будем его переписывать и писать его своими словами! Мы попытаемся донести важное с нашей точки зрения про функцию count.

Первое, что естественно надо знать это синтаксис – рано, или поздно (лучше рано) — вам все равно придется это изучать и здесь, конечно же без заглатывания учебник никак!


И в учебнике написано:

int count ( mixed var [, int mode] )

Если это вам ничего не говорит, то и особо париться не нужно, а если говорит, то я и не буду повторять… (см.учебник или пособие по php – сайты не привожу search in help)

count — Посчитать количество элементов массива или количество свойств объекта

И после охранительной теории прейдём к практике!

На самом деле если вы собираетесь, как-то соприкасаться с программированием, то вы все равно встретитесь с этой функцией count.

И давайте уже попробуем её применить к какой-то переменной.

$primer = «Пример текста в переменной»;

И второй строчкой применим к ней функцию count

Либо же можно сократить данну запись таким образом.

echo count(«Пример текста в переменной»);

И далее выведем

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

Что вообще мы хотели посчитать в этом предложении!? Мы предполагали, что такая конструкция посчитает количество символов — что было изначально не правильным посылом.

В каждой вещи есть какая-то логика — функция

Что функция смогла посчитать количество, ей надо иметь некие объекты отделенные какими-то индикаторами – это самое простое объяснение. Которое я смог придумать!

Пример №2 использование функции count

Нам строку надо разбить с помощью функции, которая это может делать

Очень часто используемая мною функция explode? первым параметром separator(разделитель) — будет у нас пробел.

$result_1 = explode(‘ ‘,$primer);

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

Ну и далее давайте попробуем применить к этому результату нашу функцию

Ну и далее мы видим, что количество слов в предложении 4.

Как я могу подсчитать количество элементов в массиве?

У меня есть этот массив:

Я попытался сделать так:

Но это дает мне ошибку, говоря, что это будет работать только со списком. Может кто-нибудь дать мне совет по этому поводу?

Примечание. Я также делаю это:

Работает ли foreach для массивов и списков?

use categoryGroups.Length для массивов

Работает ли foreach для массивов и списков?

Возможно, вы использовали

Каждый массив имеет длину. На языке С# мы получаем доступ к свойству Length для непустого массива. Длина не имеет круглых скобок, поскольку это свойство. Он доступен только для чтения — вы не можете назначить длину.

И да, конечно, foreach работает для массивов и списка. и если вы хотите увидеть, почему List List лучше, чем массивы, вы можете прочитать больше здесь

foreach работы массивов и списков

Для подсчета числа элементов в массиве

В.NET массивы и строки (которые являются технически специальными массивами символов) имеют свойство Length , и почти каждая другая коллекция имеет свойство Count для этих счетных элементов.

В дополнение к этому пространство имен System.Linq предоставляет метод расширения Count() для интерфейса IEnumerable , который реализуется большинством коллекций. Поэтому для массива вы также можете использовать myArray.Count() , если вы using System.Linq; ,

Обратите внимание, что Count() — это метод массивов и любая коллекция, реализующая IEnumerable , а Count — свойство некоторых коллекций.

foreach работает со всеми типами, которые реализуют IEnumerable .

Вы не смогли получить доступ .count свойству .count потому что оно доступно для типов списка, но вы используете Array.

Я согласен, если вы просто хотите сказать количество значений в массиве, вы можете просто напечатать значение длины массива.

Посмотрите другие вопросы по метке c# или Задайте вопрос

Count — Посчитать количество элементов массива или количество свойств объекта

277225 просмотра

30 ответа

1048 Репутация автора

В Javascript я пытаюсь взять начальный массив числовых значений и подсчитать элементы внутри него. В идеале, результатом должны быть два новых массива, первый из которых определяет каждый уникальный элемент, а второй содержит количество раз, которое встречается каждый элемент. Тем не менее, я открыт для предложений по формату вывода.

Например, если исходный массив был:

Затем будут созданы два новых массива. Первый будет содержать имя каждого уникального элемента:

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

Поскольку число 5 встречается три раза в исходном массиве, число 2 встречается пять раз, а 9 и 4 появляются один раз.

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

Ответы (30)

185 плюса

4097 Репутация автора

Вы можете использовать объект для хранения результатов:

Итак, теперь ваш объект count может сказать вам, какой счет для определенного числа:

Если вы хотите получить массив членов, просто используйте keys() функции

Автор: typeof Размещён: 14.04.2011 06:42

51 плюса

359760 Репутация автора

Не используйте два массива для результата, используйте объект:

Тогда result будет выглядеть так:

81 плюса

123620 Репутация автора

Заметка

Это меняет порядок исходного входного массива, используя Array.sort

1 плюс

19068 Репутация автора

Проверьте код ниже.

5 плюса

83484 Репутация автора

Вы можете расширить прототип Array, например так:

В качестве альтернативы вы можете использовать Array.map :

Автор: KooiInc Размещён: 14.04.2011 08:02

78 плюса


9859 Репутация автора

1 плюс

5670 Репутация автора

5 плюса

2486 Репутация автора

Вот только что-то легкое и легкое для глаз .

Редактировать: И так как вы хотите, чтобы все случаи произошли .

8 плюса

1646 Репутация автора

Если вы используете подчеркивание, вы можете пойти функциональным путем

так что ваш первый массив

и второй массив

большинство из них по умолчанию будут использовать нативные функции JavaScript, если они доступны

Автор: jhnstn Размещён: 16.10.2013 06:25

29 плюса

417 Репутация автора

Я думаю, что это самый простой способ подсчета вхождений с одинаковым значением в массиве.

64 плюса

4783 Репутация автора

Если вы используете подчеркивание или lodash, это самое простое:

Как указывалось другими, вы можете затем выполнить команду меню _.keys() и _.values() функции на результат , чтобы получить только уникальные номера, и их вхождения соответственно. Но по моему опыту, с оригинальным объектом гораздо легче иметь дело.

20 плюса

392 Репутация автора

Если вы предпочитаете один лайнер.

Изменить (12/06/2015) : объяснение изнутри. countMap — это карта, которая отображает слово с его частотой, которую мы видим в анонимной функции. Что уменьшает, так это применяет функцию с аргументами в качестве всех элементов массива, а countMap передается как возвращаемое значение последнего вызова функции. Последний параметр (<>) является значением по умолчанию countMap для первого вызова функции.

Автор: rjalfa Размещён: 03.03.2015 12:46

плюса

75 Репутация автора

Я решал аналогичную проблему на codewars и разработал следующее решение, которое работало для меня.

Это дает наибольшее количество целых в массиве, а также само целое число. Я думаю, что это может быть применено и к строковому массиву.

Чтобы правильно отсортировать строки, удалите function(a, b) изнутри sort() часть

36 плюса

7611 Репутация автора

Как насчет опции ECMAScript2015.

Этот пример передает входной массив в Set конструктор, создавая коллекцию уникальных значений. Синтаксис распространения затем расширяет эти значения в новый массив таким образом , мы можем назвать map и перевести это в двумерный массив из [value, count] пар — т.е. следующей структуры:

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

Самое замечательное в Map объекте состоит в том, что он сохраняет типы данных — то есть aCount.get(5) будет возвращаться, 3 но aCount.get(«5») будет возвращаться undefined . Это также позволяет любому значению / типу действовать как ключ, означающий, что это решение будет также работать с массивом объектов.

-1 плюса

64 Репутация автора

Вот классический метод старой школы для подсчета массивов.

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

6 плюса

662 Репутация автора

На основании ответа на @adamse и @pmandell (который я upvote), в ES6 вы можете сделать это в одной строке :

  • Редактирование 2020 года : я использую, || чтобы уменьшить размер кода и сделать его более читабельным.

Может использоваться для подсчета символов :

Автор: ESL Размещён: 01.10.2020 12:20

26 плюса

34163 Репутация автора

плюса

321 Репутация автора

Существует гораздо лучший и простой способ, которым мы можем сделать это, используя ramda.js . Пример кода здесь

const ary = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]; R.countBy(r=> r)(ary) countBy документация находится в документации

плюса

139 Репутация автора

Что касается моего комментария, спрашиваю @Emissary о корректировке своего решения. я добавляю способ, которым я обработал это:

То, что я делаю здесь, это 1-е удаление дубликатов и сохранение массива (diverArr), затем я рассчитываю на исходный массив (yourArray) количество времени, в течение которого объект был продублирован, и добавляем 4-е свойство со значением вхождений.

Надеюсь, это поможет кому-то нуждающемуся в этом конкретном решении. Он сделан с ES6.

4 плюса

7991 Репутация автора

Если вы все еще хотите два массива, вы можете использовать ответ как этот .

Или, если вы хотите, чтобы uniqueNums были числами

плюса

16 Репутация автора

Вот способ подсчета вхождений внутри массива объектов. Он также помещает содержимое первого массива в новый массив для сортировки значений, чтобы порядок в исходном массиве не нарушался. Затем используется рекурсивная функция для прохождения каждого элемента и подсчета количества свойства каждого объекта в массиве.

Автор: nate_js Размещён: 03.07.2020 03:34

14 плюса

1013 Репутация автора

Версия ES6 должна быть намного проще (еще одно решение линии)

Карта вместо простого Объекта помогает нам различать различные типы элементов, иначе все подсчеты основаны на строках

3 плюса

375 Репутация автора

Решение ES6 с уменьшением (фиксированным):

плюса

161 Репутация автора

5 плюса


959 Репутация автора

Итак, вот как я могу сделать это с некоторыми из новейших функций JavaScript:

Во-первых, уменьшите массив до Map числа:

Используя Map , ваш начальный массив может содержать любой тип объекта, и количество будет правильным. Без Map , некоторые типы объектов приведут вас к странным подсчетам. См. Map Документы для получения дополнительной информации о различиях.

Это также может быть сделано с объектом, если все ваши значения являются символами, числами или строками:

Или немного более функционально без мутаций, используя деструктуризацию и синтаксис распространения объектов:

На этом этапе вы можете использовать Map объект или для подсчета (и карта является итеративной, в отличие от объекта) или преобразовать ее в два массива.

Или для объекта:

2 плюса

2710 Репутация автора

Мое решение с рамдой:

Автор: Michal Размещён: 11.02.2020 10:26

плюса

8332 Репутация автора

Используя MAP, вы можете иметь 2 массива в выходных данных: один содержит вхождения, а другой — количество вхождений.

Автор: Melchia Размещён: 27.03.2020 11:10

1 плюс

19 Репутация автора

Вот самое простое решение

Автор: Ankur Размещён: 19.04.2020 01:22

плюса

316 Репутация автора

плюса

800 Репутация автора

Этому вопросу более 8 лет, и многие, многие ответы на самом деле не учитывают ES6 и его многочисленные преимущества.

Возможно, еще важнее подумать о последствиях нашего кода для сбора мусора / управления памятью всякий раз, когда мы создаем дополнительные массивы, делаем двойные или тройные копии массивов или даже конвертируем массивы в объекты. Это тривиальные наблюдения для небольших приложений, но если масштаб является долгосрочной целью, тщательно продумайте их.

Если вам просто нужен «счетчик» для определенных типов данных, а отправной точкой является массив (поэтому я предполагаю, что вы хотите упорядоченный список и воспользоваться множеством свойств и методов, предлагаемых массивами), вы можете просто перебрать массив1 и заполнить массив2 со значениями и количеством вхождений для этих значений, найденных в массиве1. Так просто.

Последствия копипаста или считаем в PHP количество элементов в массиве

Дата публикации: 2020-12-26

От автора: семьдесят пять, шесть, семь…. Извините, я сейчас уже заканчиваю! Семьдесят…. Сколько? Тьфу, опять сбился! В общем, создал массив, «накопипастил» в него элементов, а теперь не могут понять, сколько их. А чего я мучаюсь? Ведь с помощью PHP количество элементов в массиве подсчитать очень даже легко.

А индекс зачем?

Проще всего узнать длину обычного массива. Для этого нужно всего лишь вывести значение ключа последнего элемента. Хотя для этого тоже понадобится специальная функция (об этом позже). Хуже всего дело обстоит с ассоциативными массивами, в которых значение ключа может быть не только целочисленным, но и любым другим типом данных, поддерживаемым PHP.

Решение этой проблемы кажется простым лишь на первый взгляд. Но если длина массива «зашкаливает» за сотни или даже тысячи, тогда у любого пойдет кругом голова. И метод «раз ромашка, а я четвертую нашел» явно вам не поможет. Как не помог и мне .

Чтобы доказать выше сказанное, создадим самый непредсказуемый массив в мире. Имеется в виду, что длина, ключ и значение каждого из элементов такой структуры задается случайным числом из определенного диапазона. Для этого мы использовали функцию rand():

Как создать сайт самому?

Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

Count функция пример

Сегодня давайте попробуем разобраться на примерах — что такое функция count. Мы не пишем учебник. Поэтому и не будем его переписывать и писать его своими словами! Мы попытаемся донести важное с нашей точки зрения про функцию count.

Первое, что естественно надо знать это синтаксис – рано, или поздно (лучше рано) — вам все равно придется это изучать и здесь, конечно же без заглатывания учебник никак!

И в учебнике написано:

int count ( mixed var [, int mode] )

Если это вам ничего не говорит, то и особо париться не нужно, а если говорит, то я и не буду повторять… (см.учебник или пособие по php – сайты не привожу search in help)

count — Посчитать количество элементов массива или количество свойств объекта

И после охранительной теории прейдём к практике!

На самом деле если вы собираетесь, как-то соприкасаться с программированием, то вы все равно встретитесь с этой функцией count.

И давайте уже попробуем её применить к какой-то переменной.

$primer = «Пример текста в переменной»;

И второй строчкой применим к ней функцию count

Либо же можно сократить данну запись таким образом.

echo count(«Пример текста в переменной»);

И далее выведем

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

Что вообще мы хотели посчитать в этом предложении!? Мы предполагали, что такая конструкция посчитает количество символов — что было изначально не правильным посылом.

В каждой вещи есть какая-то логика — функция

Что функция смогла посчитать количество, ей надо иметь некие объекты отделенные какими-то индикаторами – это самое простое объяснение. Которое я смог придумать!

Пример №2 использование функции count

Нам строку надо разбить с помощью функции, которая это может делать

Очень часто используемая мною функция explode? первым параметром separator(разделитель) — будет у нас пробел.

$result_1 = explode(‘ ‘,$primer);

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

Ну и далее давайте попробуем применить к этому результату нашу функцию

Ну и далее мы видим, что количество слов в предложении 4.

Массивы

Объекты позволяют хранить данные со строковыми ключами. Это замечательно.

Но довольно часто мы понимаем, что нам необходима упорядоченная коллекция данных, в которой присутствуют 1-й, 2-й, 3-й элементы и т.д. Например, она понадобится нам для хранения списка чего-либо: пользователей, товаров, элементов HTML и т.д.

В этом случае использовать объект неудобно, так как он не предоставляет методов управления порядком элементов. Мы не можем вставить новое свойство «между» уже существующими. Объекты просто не предназначены для этих целей.

Для хранения упорядоченных коллекций существует особая структура данных, которая называется массив, Array .

Объявление

Существует два варианта синтаксиса для создания пустого массива:

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

Элементы массива нумеруются, начиная с нуля.

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

Мы можем заменить элемент:

…Или добавить новый к существующему массиву:

Общее число элементов массива содержится в его свойстве length :

Вывести массив целиком можно при помощи alert .


В массиве могут храниться элементы любого типа.

Список элементов массива, как и список свойств объекта, может оканчиваться запятой:

«Висячая запятая» упрощает процесс добавления/удаления элементов, так как все строки становятся идентичными.

Методы pop/push, shift/unshift

Очередь – один из самых распространённых вариантов применения массива. В области компьютерных наук так называется упорядоченная коллекция элементов, поддерживающая два вида операций:

  • push добавляет элемент в конец.
  • shift удаляет элемент в начале, сдвигая очередь, так что второй элемент становится первым.

Массивы поддерживают обе операции.

На практике необходимость в этом возникает очень часто. Например, очередь сообщений, которые надо показать на экране.

Существует и другой вариант применения для массивов – структура данных, называемая стек.

Она поддерживает два вида операций:

  • push добавляет элемент в конец.
  • pop удаляет последний элемент.

Таким образом, новые элементы всегда добавляются или удаляются из «конца».

Примером стека обычно служит колода карт: новые карты кладутся наверх и берутся тоже сверху:

Массивы в JavaScript могут работать и как очередь, и как стек. Мы можем добавлять/удалять элементы как в начало, так и в конец массива.

В компьютерных науках структура данных, делающая это возможным, называется двусторонняя очередь.

Методы, работающие с концом массива:

Удаляет последний элемент из массива и возвращает его:

Добавляет элемент в конец массива:

Вызов fruits.push(. ) равнозначен fruits[fruits.length] = . .

Методы, работающие с началом массива:

Удаляет из массива первый элемент и возвращает его:

Добавляет элемент в начало массива:

Методы push и unshift могут добавлять сразу несколько элементов:

Внутреннее устройство массива

Массив – это особый подвид объектов. Квадратные скобки, используемые для того, чтобы получить доступ к свойству arr[0] – это по сути обычный синтаксис доступа по ключу, как obj[key] , где в роли obj у нас arr , а в качестве ключа – числовой индекс.

Массивы расширяют объекты, так как предусматривают специальные методы для работы с упорядоченными коллекциями данных, а также свойство length . Но в основе всё равно лежит объект.

Следует помнить, что в JavaScript существует всего 7 основных типов данных. Массив является объектом и, следовательно, ведёт себя как объект.

Например, копируется по ссылке:

…Но то, что действительно делает массивы особенными – это их внутреннее представление. Движок JavaScript старается хранить элементы массива в непрерывной области памяти, один за другим, так, как это показано на иллюстрациях к этой главе. Существуют и другие способы оптимизации, благодаря которым массивы работают очень быстро.

Но все они утратят эффективность, если мы перестанем работать с массивом как с «упорядоченной коллекцией данных» и начнём использовать его как обычный объект.

Например, технически мы можем сделать следующее:

Это возможно, потому что в основе массива лежит объект. Мы можем присвоить ему любые свойства.

Но движок поймёт, что мы работаем с массивом, как с обычным объектом. Способы оптимизации, используемые для массивов, в этом случае не подходят, поэтому они будут отключены и никакой выгоды не принесут.

Варианты неправильного применения массива:

  • Добавление нечислового свойства, например: arr.test = 5 .
  • Создание «дыр», например: добавление arr[0] , затем arr[1000] (между ними ничего нет).
  • Заполнение массива в обратном порядке, например: arr[1000] , arr[999] и т.д.

Массив следует считать особой структурой, позволяющей работать с упорядоченными данными. Для этого массивы предоставляют специальные методы. Массивы тщательно настроены в движках JavaScript для работы с однотипными упорядоченными данными, поэтому, пожалуйста, используйте их именно в таких случаях. Если вам нужны произвольные ключи, вполне возможно, лучше подойдёт обычный объект <> .

Эффективность

Методы push/pop выполняются быстро, а методы shift/unshift – медленно.

Почему работать с концом массива быстрее, чем с его началом? Давайте посмотрим, что происходит во время выполнения:

Просто взять и удалить элемент с номером 0 недостаточно. Нужно также заново пронумеровать остальные элементы.

Операция shift должна выполнить 3 действия:

  1. Удалить элемент с индексом 0 .
  2. Сдвинуть все элементы влево, заново пронумеровать их, заменив 1 на 0 , 2 на 1 и т.д.
  3. Обновить свойство length .

Чем больше элементов содержит массив, тем больше времени потребуется для того, чтобы их переместить, больше операций с памятью.

То же самое происходит с unshift : чтобы добавить элемент в начало массива, нам нужно сначала сдвинуть существующие элементы вправо, увеличивая их индексы.

А что же с push/pop ? Им не нужно ничего перемещать. Чтобы удалить элемент в конце массива, метод pop очищает индекс и уменьшает значение length .

Действия при операции pop :

Метод pop не требует перемещения, потому что остальные элементы остаются с теми же индексами. Именно поэтому он выполняется очень быстро.

Аналогично работает метод push .

Перебор элементов

Одним из самых старых способов перебора элементов массива является цикл for по цифровым индексам:

Но для массивов возможен и другой вариант цикла, for..of :

Цикл for..of не предоставляет доступа к номеру текущего элемента, только к его значению, но в большинстве случаев этого достаточно. А также это короче.

Технически, так как массив является объектом, можно использовать и вариант for..in :

Но на самом деле это – плохая идея. Существуют скрытые недостатки этого способа:

Цикл for..in выполняет перебор всех свойств объекта, а не только цифровых.

В браузере и других программных средах также существуют так называемые «псевдомассивы» – объекты, которые выглядят, как массив. То есть, у них есть свойство length и индексы, но они также могут иметь дополнительные нечисловые свойства и методы, которые нам обычно не нужны. Тем не менее, цикл for..in выведет и их. Поэтому, если нам приходится иметь дело с объектами, похожими на массив, такие «лишние» свойства могут стать проблемой.

Цикл for..in оптимизирован под произвольные объекты, не массивы, и поэтому в 10-100 раз медленнее. Увеличение скорости выполнения может иметь значение только при возникновении узких мест. Но мы всё же должны представлять разницу.

В общем, не следует использовать цикл for..in для массивов.

Немного о «length»

Свойство length автоматически обновляется при изменении массива. Если быть точными, это не количество элементов массива, а наибольший цифровой индекс плюс один.

Например, единственный элемент, имеющий большой индекс, даёт большую длину:

Обратите внимание, что обычно мы не используем массивы таким образом.

Ещё один интересный факт о свойстве length – его можно перезаписать.

Если мы вручную увеличим его, ничего интересного не произойдёт. Зато, если мы уменьшим его, массив станет короче. Этот процесс необратим, как мы можем понять из примера:

Таким образом, самый простой способ очистить массив – это arr.length = 0; .

new Array()

Существует ещё один вариант синтаксиса для создания массива:

Он редко применяется, так как квадратные скобки [] короче. Кроме того, у него есть хитрая особенность.

Если new Array вызывается с одним аргументом, который представляет собой число, он создаёт массив без элементов, но с заданной длиной.

Давайте посмотрим, как можно оказать себе медвежью услугу:

Как мы видим, в коде, представленном выше, в new Array(number) все элементы равны undefined .

Чтобы избежать появления таких неожиданных ситуаций, мы обычно используем квадратные скобки, если, конечно, не знаем точно, что по какой-то причине нужен именно Array .

Многомерные массивы


Массивы могут содержать элементы, которые тоже являются массивами. Это можно использовать для создания многомерных массивов, например, для хранения матриц:

toString

Массивы по-своему реализуют метод toString , который возвращает список элементов, разделённых запятыми.

Count — Посчитать количество элементов массива или количество свойств объекта

277225 просмотра

30 ответа

1048 Репутация автора

В Javascript я пытаюсь взять начальный массив числовых значений и подсчитать элементы внутри него. В идеале, результатом должны быть два новых массива, первый из которых определяет каждый уникальный элемент, а второй содержит количество раз, которое встречается каждый элемент. Тем не менее, я открыт для предложений по формату вывода.

Например, если исходный массив был:

Затем будут созданы два новых массива. Первый будет содержать имя каждого уникального элемента:

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

Поскольку число 5 встречается три раза в исходном массиве, число 2 встречается пять раз, а 9 и 4 появляются один раз.

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

Ответы (30)

185 плюса

4097 Репутация автора

Вы можете использовать объект для хранения результатов:

Итак, теперь ваш объект count может сказать вам, какой счет для определенного числа:

Если вы хотите получить массив членов, просто используйте keys() функции

Автор: typeof Размещён: 14.04.2011 06:42

51 плюса

359760 Репутация автора

Не используйте два массива для результата, используйте объект:

Тогда result будет выглядеть так:

81 плюса

123620 Репутация автора

Заметка

Это меняет порядок исходного входного массива, используя Array.sort

1 плюс

19068 Репутация автора

Проверьте код ниже.

5 плюса

83484 Репутация автора

Вы можете расширить прототип Array, например так:

В качестве альтернативы вы можете использовать Array.map :

Автор: KooiInc Размещён: 14.04.2011 08:02

78 плюса

9859 Репутация автора

1 плюс

5670 Репутация автора

5 плюса

2486 Репутация автора

Вот только что-то легкое и легкое для глаз .

Редактировать: И так как вы хотите, чтобы все случаи произошли .

8 плюса

1646 Репутация автора

Если вы используете подчеркивание, вы можете пойти функциональным путем

так что ваш первый массив

и второй массив

большинство из них по умолчанию будут использовать нативные функции JavaScript, если они доступны

Автор: jhnstn Размещён: 16.10.2013 06:25

29 плюса

417 Репутация автора

Я думаю, что это самый простой способ подсчета вхождений с одинаковым значением в массиве.

64 плюса

4783 Репутация автора

Если вы используете подчеркивание или lodash, это самое простое:

Как указывалось другими, вы можете затем выполнить команду меню _.keys() и _.values() функции на результат , чтобы получить только уникальные номера, и их вхождения соответственно. Но по моему опыту, с оригинальным объектом гораздо легче иметь дело.

20 плюса

392 Репутация автора

Если вы предпочитаете один лайнер.

Изменить (12/06/2015) : объяснение изнутри. countMap — это карта, которая отображает слово с его частотой, которую мы видим в анонимной функции. Что уменьшает, так это применяет функцию с аргументами в качестве всех элементов массива, а countMap передается как возвращаемое значение последнего вызова функции. Последний параметр (<>) является значением по умолчанию countMap для первого вызова функции.

Автор: rjalfa Размещён: 03.03.2015 12:46

плюса

75 Репутация автора

Я решал аналогичную проблему на codewars и разработал следующее решение, которое работало для меня.

Это дает наибольшее количество целых в массиве, а также само целое число. Я думаю, что это может быть применено и к строковому массиву.

Чтобы правильно отсортировать строки, удалите function(a, b) изнутри sort() часть

36 плюса

7611 Репутация автора

Как насчет опции ECMAScript2015.

Этот пример передает входной массив в Set конструктор, создавая коллекцию уникальных значений. Синтаксис распространения затем расширяет эти значения в новый массив таким образом , мы можем назвать map и перевести это в двумерный массив из [value, count] пар — т.е. следующей структуры:

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

Самое замечательное в Map объекте состоит в том, что он сохраняет типы данных — то есть aCount.get(5) будет возвращаться, 3 но aCount.get(«5») будет возвращаться undefined . Это также позволяет любому значению / типу действовать как ключ, означающий, что это решение будет также работать с массивом объектов.

-1 плюса

64 Репутация автора

Вот классический метод старой школы для подсчета массивов.


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

6 плюса

662 Репутация автора

На основании ответа на @adamse и @pmandell (который я upvote), в ES6 вы можете сделать это в одной строке :

  • Редактирование 2020 года : я использую, || чтобы уменьшить размер кода и сделать его более читабельным.

Может использоваться для подсчета символов :

Автор: ESL Размещён: 01.10.2020 12:20

26 плюса

34163 Репутация автора

плюса

321 Репутация автора

Существует гораздо лучший и простой способ, которым мы можем сделать это, используя ramda.js . Пример кода здесь

const ary = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4]; R.countBy(r=> r)(ary) countBy документация находится в документации

плюса

139 Репутация автора

Что касается моего комментария, спрашиваю @Emissary о корректировке своего решения. я добавляю способ, которым я обработал это:

То, что я делаю здесь, это 1-е удаление дубликатов и сохранение массива (diverArr), затем я рассчитываю на исходный массив (yourArray) количество времени, в течение которого объект был продублирован, и добавляем 4-е свойство со значением вхождений.

Надеюсь, это поможет кому-то нуждающемуся в этом конкретном решении. Он сделан с ES6.

4 плюса

7991 Репутация автора

Если вы все еще хотите два массива, вы можете использовать ответ как этот .

Или, если вы хотите, чтобы uniqueNums были числами

плюса

16 Репутация автора

Вот способ подсчета вхождений внутри массива объектов. Он также помещает содержимое первого массива в новый массив для сортировки значений, чтобы порядок в исходном массиве не нарушался. Затем используется рекурсивная функция для прохождения каждого элемента и подсчета количества свойства каждого объекта в массиве.

Автор: nate_js Размещён: 03.07.2020 03:34

14 плюса

1013 Репутация автора

Версия ES6 должна быть намного проще (еще одно решение линии)

Карта вместо простого Объекта помогает нам различать различные типы элементов, иначе все подсчеты основаны на строках

3 плюса

375 Репутация автора

Решение ES6 с уменьшением (фиксированным):

плюса

161 Репутация автора

5 плюса

959 Репутация автора

Итак, вот как я могу сделать это с некоторыми из новейших функций JavaScript:

Во-первых, уменьшите массив до Map числа:

Используя Map , ваш начальный массив может содержать любой тип объекта, и количество будет правильным. Без Map , некоторые типы объектов приведут вас к странным подсчетам. См. Map Документы для получения дополнительной информации о различиях.

Это также может быть сделано с объектом, если все ваши значения являются символами, числами или строками:

Или немного более функционально без мутаций, используя деструктуризацию и синтаксис распространения объектов:

На этом этапе вы можете использовать Map объект или для подсчета (и карта является итеративной, в отличие от объекта) или преобразовать ее в два массива.

Или для объекта:

2 плюса

2710 Репутация автора

Мое решение с рамдой:

Автор: Michal Размещён: 11.02.2020 10:26

плюса

8332 Репутация автора

Используя MAP, вы можете иметь 2 массива в выходных данных: один содержит вхождения, а другой — количество вхождений.

Автор: Melchia Размещён: 27.03.2020 11:10

1 плюс

19 Репутация автора

Вот самое простое решение

Автор: Ankur Размещён: 19.04.2020 01:22

плюса

316 Репутация автора

плюса

800 Репутация автора

Этому вопросу более 8 лет, и многие, многие ответы на самом деле не учитывают ES6 и его многочисленные преимущества.

Возможно, еще важнее подумать о последствиях нашего кода для сбора мусора / управления памятью всякий раз, когда мы создаем дополнительные массивы, делаем двойные или тройные копии массивов или даже конвертируем массивы в объекты. Это тривиальные наблюдения для небольших приложений, но если масштаб является долгосрочной целью, тщательно продумайте их.

Если вам просто нужен «счетчик» для определенных типов данных, а отправной точкой является массив (поэтому я предполагаю, что вы хотите упорядоченный список и воспользоваться множеством свойств и методов, предлагаемых массивами), вы можете просто перебрать массив1 и заполнить массив2 со значениями и количеством вхождений для этих значений, найденных в массиве1. Так просто.

PHP – подсчет конкретных значений массива

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

как я могу непосредственно узнать, сколько «Бена» внутри?

Используйте функцию array_count_values() . Проверьте эту ссылку http://php.net/manual/en/function.array-count-values.php

Используйте функцию array_count_values .

$ countValues ​​= array_count_values ​​($ myArray);

Вы можете сделать это с помощью array_keys и подсчитать .

попробуйте функцию array_count_values ​​()

Попробуйте функцию PHP array_count_values .

Если вы хотите подсчитать ВСЕ те же вхождения внутри массива, вот функция, чтобы подсчитать их все и вернуть результаты в виде многомерного массива:

array_count_values работает только для целых чисел и строк. Если вам посчастливилось подсчитывать значения float / numeric (и вы не учитываете небольшие вариации точности или представления), это работает:

Обратите внимание, что я возвращаю $cnts с ключами как строки. Было бы легко их переконвертировать, но я пытаюсь определить режим для значений, поэтому мне нужно только переконвертировать первые (несколько) значений.

Я тестировал версию, которая зацикливалась, создавая массив счетчиков, а не используя array_count_values , и это оказалось более эффективным (возможно, 8-10%)!

Илон Маск рекомендует:  Option элемент выбора в меню
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Предостережение