Существует ли функция php как zip Python?

Python имеет хорошее zip() функция. Существует ли эквивалент PHP?

59
задан Edwin 28 February 2012 в 22:40
поделиться

4 ответа

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

array_map(null, $a, $b, $c, ...);

Если некоторые из массивов короче, они будут заполнены нулями до длины самого длинного, в отличие от python, где возвращаемый результат - это длина самого короткого массива.

87
ответ дан 24 November 2019 в 18:17
поделиться

array_combine уже близко.

В противном случае ничего подобного самому кодированию:

function array_zip($a1, $a2) {
  for($i = 0; $i < min(length($a1), length($a2)); $i++) {
    $out[$i] = [$a1[$i], $a2[$i]];
  }
  return $out;
}
16
ответ дан 24 November 2019 в 18:17
поделиться

Попробуйте использовать эту функцию для создания массива массивов, аналогично Python'овскому zip:

function zip() {
    $args = func_get_args();
    $zipped = array();
    $n = count($args);
    for ($i=0; $i<$n; ++$i) {
        reset($args[$i]);
    }
    while ($n) {
        $tmp = array();
        for ($i=0; $i<$n; ++$i) {
            if (key($args[$i]) === null) {
                break 2;
            }
            $tmp[] = current($args[$i]);
            next($args[$i]);
        }
        $zipped[] = $tmp;
    }
    return $zipped;
}

Вы можете передать этой функции столько массивов, сколько хотите, с таким количеством элементов, сколько хотите.

13
ответ дан 24 November 2019 в 18:17
поделиться

Я написал функции zip () для моей PHP-реализации enum .
Код был изменен, чтобы разрешить использование zip () в стиле Python , а также в стиле Ruby. Разница объясняется в комментариях:

/*
 * This is a Python/Ruby style zip()
 *
 * zip(array $a1, array $a2, ... array $an, [bool $python=true])
 *
 * The last argument is an optional bool that determines the how the function
 * handles when the array arguments are different in length
 *
 * By default, it does it the Python way, that is, the returned array will
 * be truncated to the length of the shortest argument
 *
 * If set to FALSE, it does it the Ruby way, and NULL values are used to
 * fill the undefined entries
 *
 */
function zip() {
    $args = func_get_args();

    $ruby = array_pop($args);
    if (is_array($ruby))
        $args[] = $ruby;

    $counts = array_map('count', $args);
    $count = ($ruby) ? min($counts) : max($counts);
    $zipped = array();

    for ($i = 0; $i < $count; $i++) {
        for ($j = 0; $j < count($args); $j++) {
            $val = (isset($args[$j][$i])) ? $args[$j][$i] : null;
            $zipped[$i][$j] = $val;
        }
    }
    return $zipped;
}

Пример:

$pythonzip = zip(array(1,2,3), array(4,5),  array(6,7,8));
$rubyzip   = zip(array(1,2,3), array(4,5),  array(6,7,8), false);

echo '<pre>';
print_r($pythonzip);
print_r($rubyzip);
echo '<pre>';
1
ответ дан 24 November 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: