Pos: примеры (PHP)

Работа с функцией pos для обработки массивов в PHP
Раздел: Работа с массивами
pos(array|object $array): mixed

Функция pos в PHP

Функция pos() представляет собой псевдоним функции current(). Ее основное назначение — возвращение значения текущего элемента массива. Внутренний указатель массива при этом не перемещается.

Когда используется

Функция применяется при работе с массивами, когда требуется получить значение элемента, на котором в данный момент находится внутренний указатель. Это полезно при итерации с использованием функций next(), prev(), reset(), end().

Аргументы функции

Функция принимает один обязательный параметр:

pos(array|object &$array): mixed

$array — массив или объект, реализующий интерфейс Iterator. Передается по ссылке, так как функция работает с внутренним указателем.

Возвращает значение текущего элемента массива или false, если массив пуст или указатель достиг конца.

Базовые примеры использования

Пример с ассоциативным массивом
$users = ['first' => 'Анна', 'second' => 'Петр', 'third' => 'Мария'];
echo pos($users); // Указатель изначально на первом элементе
next($users);
echo pos($users);
Анна
Петр
Пример с пустым массивом
$empty = [];
var_dump(pos($empty));
bool(false)
Использование с объектом Iterator
$arrayObject = new ArrayIterator(['яблоко', 'банан', 'вишня']);
echo pos($arrayObject);
яблоко
Проверка на конец массива
$data = [10, 20, 30];
end($data);
next($data);
var_dump(pos($data));
bool(false)

Похожие функции в PHP

current()

Прямой аналог функции pos(), идентичен во всех аспектах. Использование зависит от стиля кода.

key()

Возвращает ключ текущего элемента массива вместо значения.

Сбрасывает внутренний указатель на первый элемент и возвращает его значение. Изменяет позицию указателя.

end()

Перемещает указатель на последний элемент массива и возвращает его значение.

next() и prev()

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

each() (устарела)

Возвращала пару ключ/значение текущего элемента и перемещала указатель вперед. В PHP 7.2 объявлена устаревшей, в PHP 8 удалена.

Типичные ошибки при использовании

Передача не массива
$value = 'строка';
echo pos($value);
Warning: pos() expects parameter 1 to be array, string given
Игнорирование возврата false
$array = [0, '', false]; // Элементы, которые могут быть неотличимы от false
reset($array);
while ($current = pos($array)) {
    echo $current;
    next($array);
}

Цикл прервется на первом элементе со значением 0. Корректно использовать key() для проверки.

Предположение о неизменности указателя
$data = [1, 2, 3];
echo pos($data) . ' - ' . current($data); // Обе функции меняют указатель? Нет.
next($data);
echo pos($data);
1 - 1
2

Обе функции возвращают текущее значение, но не двигают указатель.

Изменения в последних версиях PHP

В PHP 8.0 не было внесено значительных изменений в работу функции pos(). Однако, начиная с PHP 7.4, передача не массива в функцию вызывает ошибку уровня E_WARNING, тогда как ранее это могло молчаливо возвращать false.

В PHP 8.1 функция полностью соответствует поведению current(), включая строгую типизацию параметра.

Расширенные примеры применения

Итерация с сохранением позиции
Пример php
$products = ['Монитор', 'Клавиатура', 'Мышь', 'Колонки'];
$savedPosition = current($products); // Сохраняем первый элемент
next($products);
next($products);
// Возвращаемся к сохраненному значению, не двигая указатель
echo 'Сохраненный продукт: ' . $savedPosition . ', текущий: ' . pos($products);
Сохраненный продукт: Монитор, текущий: Мышь
Использование в рекурсивной функции
Пример php
function findValue($array, $needle) {
    while (false !== ($current = pos($array))) {
        if ($current === $needle) {
            return key($array);
        }
        if (is_array($current)) {
            reset($current);
            $found = findValue($current, $needle);
            if ($found !== null) return $found;
        }
        next($array);
    }
    return null;
}
$nested = ['a' => 1, 'b' => ['x' => 10, 'y' => 20], 'c' => 3];
echo findValue($nested, 20);
y
Работа с объектами, реализующими Iterator
Пример php
class MyIterator implements Iterator {
    private $position = 0;
    private $array = ['первый', 'второй', 'третий'];
    public function current() { return $this->array[$this->position]; }
    public function key() { return $this->position; }
    public function next() { ++$this->position; }
    public function rewind() { $this->position = 0; }
    public function valid() { return isset($this->array[$this->position]); }
}
$it = new MyIterator();
$it->rewind();
echo pos($it); // Функция pos() использует current() объекта
первый
Сравнение с each() в старом коде
Пример php
// Старый стиль (PHP < 7.2):
// list($key, $val) = each($array);
// Современная замена с pos() и key():
$array = ['id' => 5, 'name' => 'test'];
$key = key($array);
$val = pos($array);
next($array);
echo "$key => $val";
id => 5

Аналоги в других языках программирования

Pos в Python

В Python нет прямой аналогии, так как итерация происходит через итераторы. Можно использовать next() с итератором.

fruits = ['apple', 'banana', 'cherry']
fruit_iter = iter(fruits)
print(next(fruit_iter))  # Текущий (первый) элемент
apple

Pos в Javascript

В JavaScript массивы не имеют внутреннего указателя. Для аналогичного поведения необходимо создавать итераторы вручную.

const fruits = ['apple', 'banana', 'cherry'];
const iterator = fruits.values();
console.log(iterator.next().value);
apple

Pos в MySQL

В контексте СУБД аналогия может быть проведена с курсорами, которые позволяют итерироваться по результатам запроса, но синтаксис и применение принципиально отличаются.

PHP pos function comments

En
Pos Alias of current