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

#php #arrays #initialization

#php #массивы #инициализация

Вопрос:

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

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

Комментарии:

1. Это все, что я когда-либо делаю.

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

3. Этот вопрос очень помогает

4. попробовать array_fill ? php.net/manual/en/function . array-fill.php

5. @zx1986 это довольно громоздкий способ создания пустого массива. Конечно, меньше, чем OP $arr = array() или $arr = []

Ответ №1:

 $myArray = []; 
  

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

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

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

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

Этот способ добавления к массиву, пришедший из других языков, показался мне странным. Я ожидал, что придется сделать что-то вроде $ myArray = «dog» или что-то в этомроде… или, может быть, метод «add ()», подобный методу Visual Basic collections. Но этот синтаксис прямого добавления, безусловно, короток и удобен.

На самом деле вам нужно использовать функцию unset () для удаления элементов:

 unset($myArray[1]); 
  

… удалил бы «house» из массива (массивы основаны на нуле).

 unset($myArray); 
  

… уничтожил бы весь массив.

Чтобы было понятно, синтаксис пустых квадратных скобок для добавления к массиву — это просто способ сообщить PHP, чтобы он автоматически присваивал индексы каждому значению, а не ВЫ присваивали индексы. Под прикрытием PHP на самом деле делает это:

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

Вы можете сами назначать индексы, если хотите, и вы можете использовать любые числа, которые вы хотите. Вы также можете присвоить индексные номера некоторым элементам, а не другим. Если вы сделаете это, PHP заполнит недостающие индексные номера, увеличивая их с наибольшего индексного номера, назначаемого по ходу дела.

Итак, если вы сделаете это:

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

… элементу «dog» будет присвоен индексный номер 21. PHP не выполняет интеллектуальное сопоставление с шаблоном для инкрементного присвоения индекса, поэтому он не будет знать, что вы, возможно, хотели, чтобы он присвоил индекс 30 «dog». Вы можете использовать другие функции, чтобы указать шаблон приращения для массива. Я не буду вдаваться в подробности здесь, но все это есть в PHP docs.

Комментарии:

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

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

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

4. Честно говоря, это фактически отвечает на вопрос OP.

5. лол… Потрясающе. Десятилетия PHP, и я только начинаю понимать, что вам не нужен array_push.

Ответ №2:

В реализациях 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).

Комментарии:

1. Возможно, изменение 5.4 было внесено потому, что люди, которые могли написать «который», взяли на себя процесс голосования 🙂

2. Я предпочитаю, $array = []; поскольку это упрощает переключение между JS и PHP.

3. Так $array = []; есть ли лучший вариант??? или я должен попробовать другой. какой из них лучше

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

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

Ответ №3:

До PHP 5.4:

 $myArray = array();
  

PHP 5.4 и выше

 $myArray = [];
  

Комментарии:

1. И как мы можем создать многомерный массив, используя PHP 5.4 или выше?

Ответ №4:

В PHP массив — это массив; нет рассмотрения примитивов и объектов, поэтому не требуется сопоставимой оптимизации.

Комментарии:

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

2. Есть ли проблема с производительностью для обоих .. где я могу проверить это .. любая ссылка или документ

3. В результате, пока вы не будете уверены, что ваш код никогда не будет запущен в средах, предшествующих версии 5.4, используйте $array = new array()

Ответ №5:

То, что вы делаете, на 100% правильно.

С точки зрения хорошего именования часто делается так, что частным / защищенным свойствам предшествует символ подчеркивания, чтобы было очевидно, что они не являются общедоступными. Например. private $_arr = array() или public $arr = array()

Комментарии:

1. Я думаю, что в php лучше не называть их с подчеркиванием, поскольку вы всегда используете $this для получения значения и никогда не должны использовать общедоступные свойства.

2. @meze вы бы получили к ним доступ, как $this->arr и $this->_arr . Почему вы никогда не должны использовать общедоступные свойства?!

Ответ №6:

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

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

Инициализация массива внутри массива :

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

Источник: Sorce для кода

Комментарии:

1. Первоначальный вопрос был о том, как инициализировать пустой массив.

2. пришел сюда за этим, но хотел бы, чтобы вы использовали сокращенную версию вместо ancient array ()

Ответ №7:

Другого способа нет, так что это лучший.

Редактировать: Этот ответ недействителен начиная с PHP 5.4 и выше.

Комментарии:

1. Это больше не так, в 5.4 введен сокращенный синтаксис для массивов.

2. @Motes Почему так много ненависти:'( ? Шутки в сторону, я сделал это более явным, «вычеркнув» старый ответ. Новичку все еще может быть полезно понять, что ответ изменился.

3. Пользователи @Motes теряют выгоду от ответа, когда удаляют его. Его лучше отредактировать.

Ответ №8:

Попробуйте это:

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

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

Комментарии:

1. Вроде как круто, но больше как трюк для вечеринки, чем действительно полезный шаблон кодирования, вы так не думаете?

2. Может быть полезно, если вы хотите создать свой массив в объекте с шаблоном свойств и в конце преобразовать его в array.

Ответ №9:

Не делайте этого:

 $arrTst = array( 'IdxKeyOne' => null, 'IdxKeyTwo' => null, 'IdxKeyThr' => null );
  

Не существует такой вещи, как «инициализация» индексных ключей массива фиктивными значениями / заполнителями. print_r дает:

 Array (
  [IdxKeyOne] => 
  [IdxKeyTwo] => 
  [IdxKeyThr] => 
)
  

где существуют элементы, имеющие определенные ключи, но нулевые значения. При последующем использовании массива вам все равно придется удалить фиктивную строку.