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

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

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

Ответ 1

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

Ответ 2

$myArray = []; 

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

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

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

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

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

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

Приветствия,

- = Камерон

Ответ 3

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

Ответ 4

До PHP 5.4:

$myArray = array();

PHP 5.4 и выше

$myArray = [];

Ответ 5

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

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

Ответ 6

Нет другого способа, поэтому это лучший.

Изменить: этот ответ недействителен с PHP 5.4 и выше.

Ответ 7

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

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

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

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

Источник: Сорение для кода

Ответ 8

Попробуйте следующее:

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

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