PHP
Структуры данных SPL
Поиск…
SplFixedArray
Отличие от PHP-массива
Тип массива по умолчанию PHP фактически реализуется как упорядоченные хеш-карты, которые позволяют нам создавать массивы, состоящие из пар ключ / значение, где значения могут быть любого типа, а ключи могут быть либо числами, либо строками. Однако традиционно не создаются массивы.
Итак, как вы можете видеть из этой иллюстрации, обычный 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 также имеют динамический размер для нас. Они растут и сжимаются, когда мы нажимаем и выставляем значения в и из массива автоматически.
Однако в традиционном массиве размер фиксирован и полностью состоит из одного и того же типа значения. Кроме того, вместо ключей каждое значение имеет доступ по его индексу, что может быть выведено его смещением в массиве.
Так как мы знаем размер данного типа и фиксированный размер массива, то смещение будет тогда 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