Лучший способ инициализировать (пустой) массив в PHP


297

В некоторых других языках (например, AS3) было отмечено, что инициализация нового массива происходит быстрее, если это делается так, var foo = []а не var foo = new Array()по причинам создания и создания объектов. Интересно, есть ли какие-нибудь эквиваленты в PHP?

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

11
Это все, что я делаю.
Мэтью

2
Спасибо всем, кто ответил (и так быстро!). Мне пришлось произвольно выбирать ответ, чтобы Энди выглядел наиболее подробно.
Том Оже

1
Этот вопрос очень помогает
Hitesh

попробовать 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 = []; лучше вариант ??? или я должен попробовать другой. какой из них лучше
Hitesh

2
@hitesh: это вопрос личных предпочтений. Они оба абсолютно одинаковы по функциональности, []их немного проще набрать.
Энди Э,

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

204
$myArray = []; 

Создает пустой массив.

Вы можете вставить значения в массив позже, например, так:

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

На данный момент $ myArray содержит «дерево», «дом» и «собака». Каждая из вышеперечисленных команд добавляется в массив, сохраняя элементы, которые уже были там.

Исходя из других языков, этот способ добавления в массив мне показался странным. Я ожидал сделать что-то вроде $ myArray + = "dog" или что-то в этом роде ... или, возможно, метод "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.

Ура,

- = Cameron


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

1
Для более ранних версий вы можете использовать array_push () w3schools.com/php/func_array_push.asp. Я не знаю, есть ли снижение производительности, связанное с этим.
Марка

3
Вы неправильно поняли точку зрения Томаугера @ Марк. $array[] = 'foo'отлично работает в старых версиях PHP. Это только $array = [];для инициализации массива, нового в 5.4.
Codemonkey

Если честно, это фактически отвечает на вопрос ОП.
Смитти

лол ... Сумасшедший. Десятилетия PHP, и я только учусь, вам не нужен array_push.
Бангкок


26

В PHP массив - это массив; не существует примитивного и объектного рассмотрения, поэтому нет никакой сопоставимой оптимизации, которую нужно иметь.


1
Лучший ответ IMO: существуют разные синтаксисы, но в отношении производительности все они одинаковы.
Матье Наполи

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.