Найкращий спосіб ініціалізації (порожній) масиву в PHP


297

У деяких інших мовах (наприклад, AS3) було відмічено, що ініціалізація нового масиву відбувається швидше, якщо робиться так, var foo = []а не var foo = new Array()з міркувань створення об'єктів та інстанцій. Цікаво, чи є еквіваленти в PHP?

class Foo {
    private $arr = array(); // is there another / better way?
}

11
Це все, що я коли-небудь роблю.
Матвій

2
Дякую всім, хто відповів (і так швидко!). Мені довелося довільно вибрати відповідь, щоб Енді здавався найбільш глибоким.
Том Ожер

1
Це питання дуже допомагає
Хітеш

спробувати array_fill? php.net/manual/en/function.array-fill.php
zx1986

2
@ zx1986 - це досить громіздкий спосіб створення порожнього масиву. Безумовно менше, ніж ОП $arr = array()або$arr = []
Том Ожер

Відповіді:


189

У реалізаціях ECMAScript (наприклад, ActionScript або JavaScript) Array()є функцією конструктора і[] є частиною граматичної граматики масиву. Обидва оптимізовані та виконуються абсолютно різними способами, при цьому буквальна граматика не зазнає накладних витрат виклику функції.

PHP, з іншого боку, має мовні конструкції, які можуть виглядати як функції, але не розглядаються як такі. Навіть з PHP 5.4, який підтримує []як альтернативу, немає різниці в накладних витратах, тому що, що стосується компілятора / аналізатора, вони є повністю синонімами.

// Before 5.4, you could only write
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// As of PHP 5.4, the following is synonymous with the above
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

Якщо вам потрібно підтримувати старіші версії PHP, використовуйте колишній синтаксис. Є також аргумент для читабельності, але, будучи давно розробником JS, останній здається мені досить природним. Я фактично помилився, намагаючись ініціалізувати масиви, використовуючи, []коли я вперше вивчав PHP.

Ця зміна мови була спочатку запропонована та відхилена через більшість голосів проти основних розробників з наступної причини:

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

Однак, схоже, відбулася зміна серця, що призвело до 5.4, можливо, це вплинуло на реалізацію підтримки таких популярних баз даних, як MongoDB (які використовують синтаксис ECMAScript).


51
Можливо, 5.4 зміни були внесені тому, що люди, які могли записати "які", взяли на себе процес голосування :)
Роб Грант

40
Я вважаю за краще, $array = [];оскільки це полегшує перехід назад і назад між JS та PHP.
Джастін

Так що $array = []; кращий варіант ??? або я повинен спробувати інший. який з них кращий
Хітеш

2
@hitesh: це питання особистих уподобань. Вони обоє абсолютно однаково функціонально, []це просто трохи простіше набрати.
Енді Е

7
Синтаксис [] здається універсальним, але важливо зазначити, що велика кількість хостів все ще використовує виключно 5.3. Якщо ви хочете поширити свій код, синтаксис [] втратить смерть.
тощо

204
$myArray = []; 

Створює порожній масив.

Ви можете натиснути значення на масив пізніше, наприклад:

$myArray[] = "tree";
$myArray[] = "house";
$myArray[] = "dog";

У цей момент $ myArray містить "дерево", "будинок" і "собаку". Кожна з вищезазначених команд додається до масиву, зберігаючи елементи, які вже були там.

Походивши з інших мов, цей спосіб додавання до масиву мені здався дивним. Я очікував, що мені доведеться зробити щось на зразок $ myArray + = "собака" чи щось таке ... або, можливо, такий метод "add ()", як колекції Visual Basic. Але цей синтаксис прямого додавання звичайно короткий і зручний.

Ви фактично повинні використовувати функцію unset () для видалення елементів:

unset($myArray[1]); 

... видалить "будинок" з масиву (масиви нульові).

unset($myArray); 

... знищив би весь масив.

Щоб було зрозуміло, синтаксис порожніх квадратних дужок для додавання до масиву - це просто спосіб сказати PHP призначати індекси кожному значенню автоматично, а не ВАС призначати індекси. Під обкладинками PHP насправді робить це:

$myArray[0] = "tree";
$myArray[1] = "house";
$myArray[2] = "dog";

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

Тож якщо ви це зробите:

$myArray[10] = "tree";
$myArray[20] = "house";
$myArray[] = "dog";

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

Ура,

- = Камерон


6
Важливо зауважити, що $ ary = [] працює лише після повідомлення PHP 5.4. З точки зору продуктивності, однак, немає переваги для [] проти масиву ().
Том Ожер

1
Для більш ранніх версій ви можете використовувати array_push () w3schools.com/php/func_array_push.asp, я не знаю, чи є хіт продуктивності, пов'язаний з цим.
Марк

3
Ви неправильно зрозуміли точку @ TomAuger @Mark. $array[] = 'foo'добре працює у старих версіях PHP. Потрібно лише $array = [];ініціалізувати новий масив у 5.4.
Codemonkey

Чесно кажучи, це насправді відповідає на питання ОП.
Smitty

хаха ... Розум подув. Десятиліття PHP, і я просто вчуся, що вам не потрібно array_push.
Bangkokian


26

У PHP масив - це масив; немає примітивного розгляду об’єкта, тому не існує порівняльної оптимізації.


1
Найкраща відповідь ІМО: Є різні синтаксиси, але щодо виступів вони всі однакові.
Матьє Наполі

1
Чи є проблеми щодо ефективності для обох .. де я можу перевірити про це .. будь-яке посилання чи документ
Hitesh

2
Як результат, поки ви не будете впевнені, що ваш код ніколи не буде запускатися в попередніх умовах 5.4, використовуйте $ array = new array ()
Tom Auger

20

Те, що ви робите, на 100% правильно.

З точки зору приємного іменування часто робиться, що приватні та захищені властивості передують підкресленням, щоб зрозуміти, що вони не є загальнодоступними. Наприклад, private $_arr = array()абоpublic $arr = array()


2
У php, я думаю, що краще не називати їх підкресленням, оскільки ви завжди використовуєте $thisдля отримання значення і ніколи не повинні використовувати публічні властивості.
мезе

1
@meze ви отримаєте доступ до них, як $this->arrі $this->_arr. Чому ти ніколи не повинен використовувати суспільні властивості ?!
Джеймс С

5

Спробуйте це:

    $arr = (array) null;
    var_dump($arr);

    // will print
    // array(0) { }

4
Якась крута, але скоріше скоріше як партійна хитрість, ніж дійсно корисна модель кодування, ви не думаєте?
Том Ожер

Може бути корисним, якщо ви хочете створити свій масив в об'єкті з шаблоном властивостей і перетворити його в масив врешті-решт.
Джомар Севільйо

4

Там немає ніякого іншого шляху , так що це найкраще.

Редагувати: Ця відповідь не вірна з PHP 5.4 і вище.


Це вже не так, 5.4 введено скорочений синтаксис для масивів.
Енді Е

13
@Motes Чому так багато ненависті: '(? Відірвавшись убік, я зробив це більш явно, "ударивши" стару відповідь. Можливо, новачкові зрозуміти, що відповідь змінилася.
Матьє Наполі

@Motes Люди втрачають прибуток від відповіді, коли видаляють його. Краще відредагувати.
mbomb007

4

Ініціалізація простого масиву:

<?php $array1=array(10,20,30,40,50); ?>

Ініціалізація масиву в масиві:

<?php  $array2=array(6,"santosh","rahul",array("x","y","z")); ?>

Джерело: Сортування за кодом


3
Початкове запитання стосувалося ініціалізації порожнього масиву.
Том Оже
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.