Лучший способ инициализировать (пустой) массив в PHP - PullRequest
271 голосов
/ 11 мая 2011

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

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

Ответы [ 8 ]

190 голосов
/ 08 января 2015
$myArray = []; 

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

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

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

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

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

Вы фактически должны использовать функцию 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";

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

Приветствия

- = Cameron

174 голосов
/ 11 мая 2011

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

53 голосов
/ 04 июня 2016

До PHP 5.4:

$myArray = array();

PHP 5.4 и выше

$myArray = [];
26 голосов
/ 11 мая 2011

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

18 голосов
/ 11 мая 2011

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

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

5 голосов
/ 24 февраля 2014

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

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

    // will print
    // array(0) { }
4 голосов
/ 15 декабря 2014

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

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

Инициализация массива в массиве:

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

Источник: Извините за код

4 голосов
/ 11 мая 2011

Нет другого пути , так что это лучший вариант.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...