有没有一种优雅的方法可以在PHP中链接数组?
我是说喜欢 目标有没有一种优雅的方法可以在PHP中链接数组?,php,arrays,Php,Arrays,我是说喜欢 目标 chain([['a', 'b'], ['c', 'd', 'e'], ['f', 'g', 'h', 'i']]); ["a","b","c","d","e","f","g","h","i"] 实际使用但不愉快的解决方案 function chain($array_of_arrays) { return call_user_func_array('array_merge', $array_of_arrays); } 实际上,我不太喜欢调用用户函数数组,也不太喜欢f
chain([['a', 'b'], ['c', 'd', 'e'], ['f', 'g', 'h', 'i']]);
["a","b","c","d","e","f","g","h","i"]
实际使用但不愉快的解决方案
function chain($array_of_arrays)
{
return call_user_func_array('array_merge', $array_of_arrays);
}
实际上,我不太喜欢调用用户函数数组,也不太喜欢foreach,所以我被困在这里。这是怎么回事:
function chain($array_of_arrays)
{
return array_reduce($array_of_arrays,'array_merge',array());
}
这是一个没有调用用户函数数组和foreach数组的三行程序:
function chain($array)
{
$return = [];
array_walk_recursive($array, function($x) use (&$return) { $return[] = $x; });
return $return;
}
实际上是这样。$input=[[a'、[b']、[c'、[d'、[e']、[f'、[g'、[h'、[i'];
函数测试调用($input)
{
返回调用用户函数数组('array\u merge',$input);
}
功能测试\u foreach($input)
{
$result=[];
foreach($input作为$array){
foreach($array作为$value){
$result[$value]=true;
}
}
返回数组_键($result);
}
功能测试减少($input)
{
返回array_reduce($input,'array_merge',[]);
}
$start=microtime(真);
对于($i=0;$i<1e5;++$i){
测试调用($input);
}
变量转储(微时间(真)-$start);
$start=microtime(真);
对于($i=0;$i<1e5;++$i){
每个测试单元($input);
}
变量转储(微时间(真)-$start);
$start=microtime(真);
对于($i=0;$i<1e5;++$i){
测试减少(投入);
}
变量转储(微时间(真)-$start);
结果
调用用户函数数组-双精度(0.56941080093384)foreach-双精度(0.70889902114868)
array\u reduce-double(0.76243710517883)使用array\u push如何?请参阅下面的RMY初学者不需要考虑给定的输入,ArayyPube会考虑两个前缀):所以重申一下,你不喜欢一个语言结构,它允许你执行迭代,你不喜欢你提出的解决方案。我是否遗漏了一些东西,或者我们编写代码纯粹是为了炫耀我们的代码基于hipster标准有多漂亮?如果PHP真的用错误的方式来摩擦你,我会考虑完全替换Python,而忽略PHP作为一种语言。一个程序员应该能够把“丑陋”的解决方案变成美丽的解决方案(美丽是随意的)。@N.B:我认为你想得太多了!!OP只需要一个等效的解决方案/方法…冷静点!!:)这难道不是一个比问题已经显示的更糟糕的版本吗?@Jon好吧,这是一个意见的问题,是否更糟。。。OP要求另一种解决方案,结果是。。。如果你认为你有一个更好的,你可以发布它…:)@克莱米:我不会对答案投反对票,所以假设我在这个问题上投了-1票,这不是关于替代方案,而是关于更好的替代方案!!:)我使用“更差”的意思是,它非常接近原始版本,但涉及到一个实际上并不需要的附加函数(
array\u reduce
)。做更多的工作以获得相同的结果,但没有附加值。@NoobEditor谢谢,你真好:)但是,我不明白这个答案有什么问题。。。当然,它使用的方法与OP提出的方法非常相似,但它使用的逻辑不同。。。真正的问题是OP不喜欢调用call_user_func_数组(我不知道为什么)或foreach循环,所以我提出了一个函数,它既不使用call_user_func_数组,也不使用foreach循环。。。就这样!如果你能做得更好,再次发布你的答案,我会投票给你问题是我没有把数组放在单独的变量中,而是放在一个数组中,我不知道我有多少。这种测试的结果可能取决于数组的数量和每个数组中的值的数量。我也不是在寻找一个快速的解决方案,那些时间是可以忽略的,我是在寻找一个可读/优雅的解决方案。
$input = [['a', 'b'], ['c', 'd', 'e'], ['f', 'g', 'h', 'i']];
function test_call($input)
{
return call_user_func_array('array_merge', $input);
}
function test_foreach($input)
{
$result = [];
foreach ($input as $array) {
foreach ($array as $value) {
$result[$value] = true;
}
}
return array_keys($result);
}
function test_reduce($input)
{
return array_reduce($input, 'array_merge', []);
}
$start = microtime(true);
for ($i = 0; $i < 1e5; ++$i) {
test_call($input);
}
var_dump(microtime(true) - $start);
$start = microtime(true);
for ($i = 0; $i < 1e5; ++$i) {
test_foreach($input);
}
var_dump(microtime(true) - $start);
$start = microtime(true);
for ($i = 0; $i < 1e5; ++$i) {
test_reduce($input);
}
var_dump(microtime(true) - $start);