Функция 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 применяют для получения нестатических свойств объекта, что вполне подходит для нашего примера.