Подтвердить что ты не робот

Есть кортежи в PHP?

Я знаю, что на Python и на других языках у нас есть доступ к кортежам, чтобы облегчить, семантически или иначе структурирование данных.

Мой вопрос: имеет ли PHP кортежи?

Если нет, какой ближайший объект?

4b9b3361

Ответ 1

Массив - это только реальная встроенная структура данных, которую люди используют для всего.

Массивы в PHP - это все хеш-таблицы, которые могут иметь как числовые, так и строковые индексы и могут содержать что угодно (обычно больше массивов).

Есть несколько массивов, которые работают как кортежи.

Увидеть

http://us1.php.net/manual/en/language.types.array.php

http://us1.php.net/list

Список очень удобен для возврата нескольких значений из функции.

Ответ 2

Массивы в php очень похожи на кортежи:

// one dimensional mixed data
$x = [1, 2, "hello"];

// multidimensional third element
$y = [1, 2, [3, 4, 5]];

// assigning to variables (list unpacking)
list($a, $b, $c) = $x; //$a is 1, $b is 2, $c is "hello"

Ответ 3

Из https://coderwall.com/p/bah4oq:

function foo()
{
    return array('foo', 'bar');
}

list($a, $b) = foo();

Вы можете передать массив объектов, которые будут использоваться точно так же, как кортеж. Вы также можете хранить гетерогенные типы в массиве сразу, что очень близко имитирует функциональность кортежа.

Ответ 4

Предыдущие ответы верны в том, что вы можете имитировать кортежи с массивами PHP, но только в ограниченном смысле, а не во всех случаях использования. Это очевидно, если вы хотите использовать кортежи в качестве ключей к карте. Например. при реализации конечного автомата ключи в вашей таблице перехода будут кортежи:

(currState, Event) -> newState

Если бы у нас была правильная поддержка кортежа в PHP, мы могли бы сделать что-то вроде этого:

$trTable = [
    ['currState', 'fooEvent'] => 'fooState',
    ['currState', 'barEvent'] => 'barState',
    ...
];

Вместо этого мы должны имитировать это следующим образом:

$trTable = [
    'currState' => [
        'fooEvent' => 'fooState',
        'barEvent' => 'barState',
    ],
    ...
];

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

Ответ 5

Начиная с PHP 7.1 было представлено симметричное разрушение массивов, которое позволяет назначать так же, как list() как упоминалось в предыдущих комментариях.

// list() style
list($id1, $name1) = [1, 'Hello']; // Same as $id1 = 1 and $name1 = 'Hello'

// [] style
[$id2, $name2] = [2, 'World']; // Same as $id2 = 2 and $name2 = 'World'

http://php.net/manual/en/migration71.new-features.php#migration71.new-features.symmetric-array-destructuring