Home » Php » Are there tuples in PHP?

Are there tuples in PHP?

Posted by: admin November 30, 2017 Leave a comment

Questions:

I know in Python and other languages we have access to tuples to better facilitate, semantically or otherwise, the structuring of data.

My question is: Does PHP have tuples?

If not, what is the nearest facility?

Answers:

PHP’s only real built in data structure that people use for everything is the array.

Arrays in PHP are all hash tables and can have either numeric of string indexes and can contain anything (usually more arrays).

There are a few array constructs that work like tuples.

See

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

http://us1.php.net/list

List is very convenient for returning multiple values from a function.

Questions:
Answers:

Arrays in php can be used very much like a tuple:

// 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"

The only problematic difference is how you have to keep typing array again and again. Not as pretty as tuples.

Update – As of PHP 5.4, you can replace array() with square brackets []. The above examples can look like this now:

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

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

Questions:
Answers:

From https://coderwall.com/p/bah4oq:

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

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

You can pass an array of objects to be used just like a tuple. You can also store heterogeneous types in the array at once, which mimics very closely the functionality of a tuple.

Questions:
Answers:

The previous answers are correct in that you can simulate tuples with PHP arrays, however only in a limited sense, not all use cases. This is evident when you want to use tuples as keys to a map. Eg. when implementing a state machine, keys in your transition table would be tuples:

(currState, Event) -> newState

If we had proper tuple support in PHP we could do something like this:

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

Instead we have to simulate it like this:

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

Both achieve the same result, but the first one has clear semantics.