将两个数组之间的柱状值内爆为串联字符串的平面数组

Implode columnar values between two arrays into a flat array of concatenated strings

我有两个数组,$array_A$array_B。我想将 $array_B 的第一个值附加到 $array_A 的第一个值的末尾,并对两个数组中的所有元素重复此方法。

$array_A = ['foo', 'bar', 'quuz'];
$array_B = ['baz', 'qux', 'corge'];

压缩后的预期输出:

['foobaz', 'barqux', 'quuzcorge']

array_merge($array_A, $array_B) 只是将数组 B 附加到数组 A 上,而 array_combine($array_A, $array_B) 将数组 A 设置为数组 B 的键,这两者我都不想要。 array_map 似乎非常接近我想要的,但似乎总是在两者之间添加一个 space,这是我不想要的。

如果每个数组的长度不相关(例如数组 A 有五个条目,数组 B 有七个条目,额外的条目 ignored/trimmed),这将是理想的选择。

可能是最快的代码,但比其他选项更冗长。

//updated version
$array_A = ['foo', 'bar', 'quuz'];
$array_B = ['baz', 'qux', 'corge'];

for ($i = 0, $c = count($array_A); $i<$c; $i++) {
    $result[$i] = $array_A[$i].$array_B[$i];
}

var_dump($result);

PHP 中没有一个数组函数可以做到这一点。但是,你可以自己写一个,比如这个:

function array_zip($a1, $a2) {
  $out = [];
  for($i = 0; $i < min(sizeof($a1), sizeof($a2)); $i++) {
    array_push($out, $a1[$i] .  $a2[$i]);
  }
  return $out;
}

所以给出这些数组和运行它:

$a = ["foo", "bar"];
$b = ["baz", "qux"];
print_r(array_zip($a, $b));

你会得到:

Array
(
    [0] => foobaz
    [1] => barqux
)

试试这个:

$A = ['foo', 'bar'];
$B = ['baz', 'qux'];

function arraySquish($array) 
{
  $new = [''];
  foreach($array as $val) {
    $new[0] .= $val;
  }

  return $new;
}

$A = arraySquish($A);
$B = arraySquish($B);

echo '<pre>';
print_r($A);
print_r($B);
echo '</pre>';

PHP Fiddle here.

// updated version
$a = ['a', 'b', 'c'];
$b = ['d', 'e', 'f', 'g']; 
print_r(array_map('implode', array_map(null, $a, $b)));

显式 array_map:

<?php

$colours  = ['red', 'white', 'blue'];
$items    = ['robin', 'cloud', 'mountain']; 

$squished =
    array_map(
        function($colour, $item) {
            return $colour.$item;
        },
        $colours,
        $items
    );

var_export($squished);

输出:

array (
    0 => 'redrobin',
    1 => 'whitecloud',
    2 => 'bluemountain',
  )

如果您只想找到最小的数组,您可以 return null(如果其中一个条目为空),然后过滤结果。

或将数组截断为相同长度:

$b = array_intersect_key($b, $a);
$a = array_intersect_key($a, $b);

无论两个数组是否具有相同的长度,或者一个是否比另一个长,或者数组以什么顺序出现,以下技术都会将值“压缩”到一个平面字符串数组中。

array_map() 只需调用一次,implode() 的默认“胶水”字符串是空字符串——因此可以省略。

代码:(Demo)

$a = ['a', 'b', 'c'];
$b = ['d', 'e', 'f', 'g']; 
var_export(array_map(fn() => implode(func_get_args()), $a, $b));

或者用展开运算符合并列数据:(Demo)

var_export(array_map(fn(...$column) => implode($column), $a, $b));

输出:

array (
  0 => 'ad',
  1 => 'be',
  2 => 'cf',
  3 => 'g',
)