用关联键组合和转置三个数组



我有三个数组作为实例

Array1
array (size=3)
0 => string 'a' (length=1)
1 => string 'b' (length=1)
2 => string 'c' (length=1)
Array2
array (size 3)
0 => string '$' (length=1)
1 => string '%' (length=1)
2 => string '^' (length=1)
Array3
array (size 3)
0 => int '1' (length=1)
1 => int '2' (length=1)
2 => int '3' (length=1)

我想要一个array4是有这样的配置,每个数组的每一行应该是一个组。例如

Array4
0th 
name=a
type=$
price=1
1st
name=b
type=%
price=2
2nd
name=c
type=^
price=3

我尝试了这个,给了我完美的结果

$output = array_combine($array1, $array2);

但是当我尝试这个时,它不会给出预期的结果

$output = array_combine(array_combine($array, $array2),$array3);

使用功能辅助器

通过使用array_maparray_combine,您可以跳过处理计数,迭代器,手动数组赋值和手动数组组合等事情。

这个解决方案通过使用过程来降低复杂性,这些过程将所有的复杂性隐藏在有用的、功能性的api后面。

$names = ['a', 'b', 'c'];
$types = ['$', '%', '^'];
$prices = [1, 2, 3];
$result = array_map(function ($name, $type, $price) {
  return array_combine(
    ['name', 'type', 'price'],
    [$name, $type, $price]
  );
}, $names, $types, $prices);
echo json_encode($result, JSON_PRETTY_PRINT);

输出(为了简洁,删除了一些换行符)

[
  {"name": "a", "type": "$", "price": 1},
  {"name": "b", "type": "%", "price": 2},
  {"name": "c", "type": "^", "price": 3}
]

隐藏自己的复杂性

你甚至可以通过定义你自己的过程来抽象你自己的复杂性,array_zip_combine —它像array_combine一样工作,但接受多个输入数组,这些数组在组合之前首先"压缩"

这个解决方案需要PHP 7+

// PHP 7 offers rest parameter and splat operator to easily apply variadic function
function array_zip_combine (array $keys, ...$arrs) {
  return array_map(function (...$values) use ($keys) {
    return array_combine($keys, $values);
  }, ...$arrs);
}
$result = array_zip_combine(['name', 'type', 'price'], $names, $types, $prices);

PHP 5.4+

// PHP 5 doesn't offer splat operator so we have to use
// call_user_func_array to apply a variadic function
function array_zip_combine (array $keys /* args */) {
  $f = function () use ($keys) { return array_combine($keys, func_get_args()); };
  return call_user_func_array(
    'array_map',
    array_merge([$f], array_slice(func_get_args(), 1))
  );
}
$result = array_zip_combine(['name', 'type', 'price'], $names, $types, $prices);

使用array_maparray_combine函数的简单解:

$result = array_map(function($item) {
    return array_combine(['name', 'type', 'price'], $item);
}, array_map(null, $array1, $array2, $array3));
print_r($result);
输出:

Array
(
    [0] => Array
        (
            [name] => a
            [type] => $
            [price] => 1
        )
    [1] => Array
        (
            [name] => b
            [type] => %
            [price] => 2
        )
    [2] => Array
        (
            [name] => c
            [type] => ^
            [price] => 3
        )
)

如果您知道所有三个数组的长度相同,并且包含所有需要的数据,那么一个简单的修复方法是遍历该长度并构建您的结果数组:

$result = []; 
$count = count($array1);
for($i=0; $i < $count; $i++){
    $result[$i] = [
        'name'=>$array1[$i],
        'type'=>$array2[$i],
        'price'=>$array3[$i]
    ];
}

$result包含您需要的内容。你正在尝试的——array_combined()——不是用来用其他数组的值来构建一个数组,所以它不适用于这个目的。该函数将构建一个数组,其键来自一个数组,值来自另一个数组。