我有三个数组作为实例
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_map
和array_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_map
和array_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()
——不是用来用其他数组的值来构建一个数组,所以它不适用于这个目的。该函数将构建一个数组,其键来自一个数组,值来自另一个数组。