Я знаю, что на Python и на других языках у нас есть доступ к кортежам, чтобы улучшить, семантически или иначе, структурирование данных.
Мой вопрос: имеет ли PHP кортежи?
Если нет, то какой ближайший объект?
Только реальная встроенная структура данных PHP, которую люди используют для всего, – это массив.
Массивы в PHP – это все хэш-таблицы и могут содержать либо числовые индексы строк, либо содержать что угодно (обычно больше массивов).
Существует несколько конструкций массивов, которые работают как кортежи.
Видеть
http://us1.php.net/manual/en/language.types.array.php
Список очень удобен для возврата нескольких значений из функции.
Массивы в php можно использовать очень похоже на кортеж:
// one dimensional mixed data $x = array(1, 2, "hello"); // multidimensional third element $y = array(1, 2, array(3, 4, 5)); // assigning to variables (list unpacking) list($a, $b, $c) = $x; //$a is 1, $b is 2, $c is "hello"
Единственное проблемное различие заключается в том, как вы должны постоянно вводить array
. Не так красиво, как кортежи.
Обновление. Начиная с PHP 5.4, вы можете заменить array()
квадратными скобками []
. Вышеприведенные примеры могут выглядеть следующим образом:
// one dimensional mixed data $x = [1, 2, "hello"]; // multidimensional third element $y = [1, 2, [3, 4, 5]];
Из https://coderwall.com/p/bah4oq :
function foo() { return array('foo', 'bar'); } list($a, $b) = foo();
Вы можете передать массив объектов, которые будут использоваться точно так же, как кортеж. Вы также можете хранить гетерогенные типы в массиве сразу, что очень близко имитирует функциональность кортежа.
Предыдущие ответы верны в том, что вы можете имитировать кортежи с массивами PHP, однако только в ограниченном смысле, а не во всех случаях использования. Это очевидно, если вы хотите использовать кортежи в качестве ключей к карте. Например. при реализации конечного автомата ключи в таблице перехода будут иметь кортежи:
(currState, Event) -> newState
Если бы у нас была правильная поддержка кортежей в PHP, мы могли бы сделать что-то вроде этого:
$trTable = [ ['currState', 'fooEvent'] => 'fooState', ['currState', 'barEvent'] => 'barState', ... ];
Вместо этого мы должны имитировать это следующим образом:
$trTable = [ 'currState' => [ 'fooEvent' => 'fooState', 'barEvent' => 'barState', ], ... ];
Оба достигают такого же результата, но первый имеет четкую семантику.