phpでzipしたい

php で zip したい場合は、array_map を使う(!!)

<?php
$arr1 = ["a", "b", "c"];
$arr2 = ["A", "B", "C"];
$arr3 = ["エー", "ビー", "シー"];

$zipped = array_map(
  function($a, $b, $c){
    return [$a, $b, $c];
  },
  $arr1,
  $arr2,
  $arr3
);

$zipped; // [["a", "A", "エー"],["b", "B", "ビー"], ["c", "C", "シー"]]

PHPのarray_mapは配列を複数放りこむことができ、配列を複数放り込んだ場合はmapのわたす関数の引数にそれぞれの配列の要素が順に入ってくる。ことを利用するとzip的なことができるっぽい。

さらに面白いことに、関数の代わりにnullをわたすと上記のzip操作と同じ動きをする。なんでや!って感じするけど。

ちなみに、長さの違う配列を複数渡した場合、足りない分はNULLが渡ってくる。

<?php
$arr1 = ["a", "b", "c"];
$arr2 = ["A", "B"];
$arr3 = ["エー", "ビー"];

$zipped = array_map(
  null,
  $arr1,
  $arr2,
  $arr3
);

$zipped; // [["a", "A", "エー"],["b", "B", "ビー"], ["c", null, null]]

このarray_map、他の言語ではあまり見かけない挙動のように思うし、これってarray_mapっていう名前でいいのかなって感じもするけど、zipとmapを一緒にやりたいときとかはこれはこれで便利っぽい気もする。というのも、PHPには遅延リストがない(よね?)ので、zipしてmapすると2回配列をトラバースすることになるけど、これなら一回のトラバースで良いので効率的ではある(zipとmapを一緒にやりたいときにのみ効いてくる効率化がどれほど重要かという話はあると思うけどまあそれはそれとしておいておきましょうよ)。PHPらしく、長さの違う配列渡したときにどっちに合わせるかを決めるオプションがありそう!!!とか思って探したけど、なかったっぽい。

see also: PHP: array_map - Manual