Sizeof PHP: розмір масивів та об'єктів, зменшення часу виконання скриптів
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(), тому має сенс застосовувати її на практиці.
<!-- fb_336x280_1 -->
<script> (adsbygoogle = window.adsbygoogle ||[]).push({});
У циклах завжди краще sizeof php замінити на змінну, бо інакше розмір масиву буде визначатися кожною ітерацією, що уповільнює процес.
$test = array( 123 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 або іншого користувача функції.
<!-- fb_336x280_2 -->
<script> (adsbygoogle = window.adsbygoogle ||[]).push({});
Додамо масив $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 застосовують для отримання нестатических властивостей об'єкта, що цілком підходить для нашого прикладу.