Поиск…


SplFixedArray

Отличие от PHP-массива

Тип массива по умолчанию PHP фактически реализуется как упорядоченные хеш-карты, которые позволяют нам создавать массивы, состоящие из пар ключ / значение, где значения могут быть любого типа, а ключи могут быть либо числами, либо строками. Однако традиционно не создаются массивы.

Традиционный массив PHP Рисунок 1

Итак, как вы можете видеть из этой иллюстрации, обычный PHP-массив можно рассматривать скорее как упорядоченный набор пар ключ / значение, где каждый ключ может отображать любое значение. Обратите внимание, что в этом массиве есть ключи, которые являются как числами, так и строками, а также значениями разных типов, и ключ не имеет отношения к порядку элементов.

$arr = [
    9     => "foo",
    1     => 4.2,
    "bar" => null,
];

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

Таким образом, приведенный выше код даст нам именно то, что мы ожидаем.

9 => foo
1 => 4.2
bar => 

Регулярные массивы PHP также имеют динамический размер для нас. Они растут и сжимаются, когда мы нажимаем и выставляем значения в и из массива автоматически.


Однако в традиционном массиве размер фиксирован и полностью состоит из одного и того же типа значения. Кроме того, вместо ключей каждое значение имеет доступ по его индексу, что может быть выведено его смещением в массиве.

SplFixedArray Рисунок 2

Так как мы знаем размер данного типа и фиксированный размер массива, то смещение будет тогда type size * n n представляет собой позицию значения в массиве. Итак, в приведенном выше примере $arr[0] дает нам 1 , первый элемент в массиве и $arr[1] дает нам 2 и т. Д.

Однако SplFixedArray не ограничивает тип значений. Он ограничивает только ключи от типов номеров. Он также имеет фиксированный размер.

Это делает SplFixedArrays более эффективным, чем обычные PHP-массивы, определенным образом. Они более компактны, поэтому требуют меньше памяти.

Создание экземпляра массива

SplFixedArray реализуется как объект, но к нему можно получить доступ с помощью того же знакомого синтаксиса, что вы обращаетесь к обычному массиву PHP, поскольку они реализуют интерфейс ArrayAccess . Они также реализуют интерфейсы Countable и Iterator поэтому они ведут себя так же, как вы привыкли к массивам, ведущим себя в PHP (например, такие вещи, как count($arr) и foreach($arr as $k => $v) работают одинаково для SplFixedArray, как и обычные массивы в PHP.

Конструктор SplFixedArray принимает один аргумент, который является размером массива.

$arr = new SplFixedArray(4);

$arr[0] = "foo";
$arr[1] = "bar";
$arr[2] = "baz";

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

Это дает вам то, что вы ожидаете.

0 => foo
1 => bar
2 => baz
3 => 

Это также работает так, как ожидалось.

var_dump(count($arr));

Дает нам...

int(4)

Обратите внимание, что в SplFixedArray, в отличие от обычного массива PHP, ключ отображает порядок элемента в нашем массиве, потому что это истинный индекс, а не только карта .

Изменение размера массива

Просто имейте в виду, что, поскольку массив имеет фиксированный размер, count всегда будет возвращать одно и то же значение. Таким образом, в то время как unset($arr[1]) приведет к $arr[1] === null , count($arr) остается 4 .

Поэтому для изменения размера массива вам нужно будет вызвать метод setSize .

$arr->setSize(3);

var_dump(count($arr));

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

Теперь мы получаем ...

int(3)
0 => foo
1 => 
2 => baz

Импорт в SplFixedArray и экспорт из SplFixedArray

Вы также можете импортировать / экспортировать обычный PHP-массив в и из SplFixedArray с помощью fromArray и toArray .

$array      = [1,2,3,4,5];
$fixedArray = SplFixedArray::fromArray($array);

foreach($fixedArray as $value) {
    echo $value, "\n";
}
1
2
3
4
5

Иду в другую сторону.

$fixedArray = new SplFixedArray(5);

$fixedArray[0] = 1;
$fixedArray[1] = 2;
$fixedArray[2] = 3;
$fixedArray[3] = 4;
$fixedArray[4] = 5;

$array = $fixedArray->toArray();

foreach($array as $value) {
    echo $value, "\n";
}
1
2
3
4
5


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow