09-06-2018 11:48

Sizeof PHP: размер массивов и объектов, уменьшение времени выполнения скриптов

Функция sizeof в php является псевдонимом count(), как и count(), получает количество "ключ - значение" массива или объекта. Обязательным параметром является массив или объект, необязательным - второе значение COUNT_RECURSIVE, или 1 (по умолчанию - 0), если установлен, то считает рекурсивно.

PHP: как сократить количество итераций в цикле и уменьшить время выполнения скрипта?

Так как count() и sizeof php используются в циклах очень часто, то следует изучить их досконально.

Архитектура программного обеспечения: виды, описание, разработкаВам будет интересно:Архитектура программного обеспечения: виды, описание, разработка

$array = array( "fruit" =>array( "apple", "bananas", "orange", ), "vegetables" =>array( "potatoes", "tomatoes", ), );

echo "По умолчанию = ".sizeof($array); //По умолчанию = 2 echo "Рекурсивно = ".sizeof($array, 1); //Рекурсивно = 7

Тестирование больших массивов в цикле (более 65000 элементов) показало, что sizeof() быстрее, чем count(), поэтому имеет смысл применять ее на практике.

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

$test = array( 1, 2, 3, 4 ); $sizeof_test = sizeof( $test ); for ( $it=0; $it < $sizeof_test; $it++ ) { echo $test[$it]; }

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

Рассмотрим массив с нулевыми значениями:

$test2 = array( '', null, false, 0 ); var_dump( sizeof( $test2 ) ); //выведет int(4) var_dump( sizeof( array_filter( $test2 ) ) ); //выведет int(0)

Как видно из примера, sizeof php (и count тоже), считают количество элементов, в том числе и нулевые, поэтому нужно это учитывать и (если необходимо) удалять пустые значения с помощью array_filter или другой пользовательской функции.

Добавим массив в $test2:

$test2 = array( '',null,false,0, array() ); //выведет int(0) $test2 = array( '',null,false,0, array( null ) ); //выведет int(1) var_dump( sizeof( array_filter( $test2 ) ) );

В данном примере array_filter удалил все пустые значения одномерного массива, но эта функция не имеет рекурсивного действия, поэтому значение "null" "внутреннего" массива осталось, а значит sizeof php его учитывает.

Давайте посмотрим что будет, если убрать array_filter?

$test2 = array('', null, false, 0, array() ); //выведет int(5) $test2 = array('', null, false, 0, array( null ) ); //выведет int(5) $t_rec = array('', null, false, 0, array() ); //выведет int(5) $t_rec = array('', null, false, 0, array( null ) ); //выведет int(6) var_dump( sizeof( $test2 ) ); var_dump( sizeof( $t_rec, 1 ) );

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

Как посчитать объект StdClass созданный из json_decode с помощью sizeof php?

$json = '{ "foo": "bar", "number": 10 , "car": "BMW" }'; $stdInstance = json_decode( $json ); var_dump( sizeof( ( array )$stdInstance ) ); //выведет int(3) var_dump( sizeof( get_object_vars( $stdInstance ) ) ); //выведет int(3)

Sizeof() определяет количество элементов массива или объекта Countable. StdClass не является ни тем, ни другим. Чтобы получить объект в виде массива, используйте функцию get_object_vars. Первый вариант с (array) тоже работает, но все же второй вариант кажется более надежным.

Get_object_vars применяют для получения нестатических свойств объекта, что вполне подходит для нашего примера.



Источник