読者です 読者をやめる 読者になる 読者になる

phpでarray_zip()相当のことをしたい

がっつり既出ネタ

array_zip

phpでarray_zip()みたいなことをしたい。

つまり、pythonのzipのように リストを二つ渡すとタプルのリストを生成してくれる関数がほしい。

# -*- coding: utf-8 -*-
a = [1,2,3]
b = ["a", "b", "c"]
zip(a,b)
# [(1, 'a'), (2, 'b'), (3, 'c')]

ついでに

# ...
c = [4,5,6]
zip(a,b,c)
# [(1, 'a', 4), (2, 'b', 5), (3, 'c', 6)]

みたいにn-tupleが生成できると嬉しい。

phpにタプルは無いけれど配列ベースでなら、array_mapのコールバック関数にnullを指定するとできるらしい。

<?php
$a = [1,2,3]
$b = ["a", "b", "c"]

array_map(null, $a, $b);
# [[1, "a"], [2, "b"], [3, "c"]]
?>

とのこと。 関数化すると、こんな感じ

<?php
function array_zip($args) {
  $args = func_get_args();
  array_unshift($args, null);
  return call_user_func_array("array_map", $args);
}
?>

もちろん配列ベースなのでmutableだし要素追加も出来てしまうんだけど、・・・

あれ・・・メリットあるのかな・・・

array_column

array_系の関数といえばphp5.5からのarray_columnが楽しそうです。 いわゆるpluck*1的なことができる関数で、PHP: array_column - Manualから例を持ってくると、

<?php
$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    )
);
 
$first_names = array_column($records, 'first_name');
# ["John", "Sally", "Jane", "Peter"]
?>

のような感じ。

*1:そういえばpythonにpluckは無いのかと思ったらfuncyなるモジュールがあるらしい