Sizeof PHP: розмір масивів та об'єктів, зменшення часу виконання скриптів

35 0 Новини високих технологій

Функція 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(), тому має сенс застосовувати її на практиці.

<script async="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">
<!-- 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 або іншого користувача функції.

<script async="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">
<!-- 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 ) );

Якщо пустими не були введені в код навмисно, то краще від них позбавитися за допомогою функцій-фільтрів перш ніж запускати цикл. Це прибере зайві ітерації циклу та скоротить час на виконання процесу.

Sizeof PHP: розмір масивів та об'єктів, зменшення часу виконання скриптів

Як порахувати об'єкт 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) теж працює, але все ж другий варіант здається більш надійним.
Sizeof PHP: розмір масивів та об'єктів, зменшення часу виконання скриптів
Get_object_vars застосовують для отримання нестатических властивостей об'єкта, що цілком підходить для нашого прикладу.