2011-06-11 141 views
1

我有一个表单提交关于检查点的报告。每个检查点都有一个“状态”和一个“评论”。形式设置,使它返回键为这样的检查点ID的多维数组:PHP - 将数组值连接成一个新数组,给定两个具有相同键的数组

array(3) { 
    ["status"]=> 
    array(2) { 
    ["000046"]=> 
    string(1) "S" 
    ["000047"]=> 
    string(1) "S" 
    } 
    ["comment"]=> 
    array(2) { 
    ["000046"]=> 
    string(6) "Flarg." 
    ["000047"]=> 
    string(0) "" 
    } 
    ["submit"]=> 
    string(13) "SUBMIT REPORT" 
} 

在上文中,检查点000046具有“S”的状态和Flarg的”评论。 “

我想要做的是创建一个新的数组,将两个值以特定格式结合在一起,同时保留键。末端应该看起来像这样:

array(1) { 
    ["000046"]=> 
    string(10) "S-'Flarg.'" 
    ["000047"]=> 
    string(1) "S" 
} 

什么是最有效的方式去做这个?

回答

1

鉴于$array$array2你的两个数组

$result = array(); 
foreach($array as $k=>$v) { 
    $result[$k] = $v; 
    if (isset($array2[$k])) 
    $result[$k] .= '-' . $array2[$k]; 
} 
print_r($result); 
+1

+1好答案! – AlphaMale 2013-05-09 17:55:26

0

没有本地的PHP函数来为你做这个(这将是最有效的)。只需循环两个数组并开始收集。

一个代码示例会被侮辱,所以我省略了它。

0

鉴于$checkpoints在你的问题中列出的array,你可以使用:

$newCheckpoints = array(); 
foreach ($checkpoints['status'] as $k => $status) { 
    $newCheckpoints[$k] = $status . (!empty($checkpoints["comment"][$k]) ? "-'{$checkpoints['comment'][$k]}'" : ''); 
} 
0

首先合并递归地状态和评论的阵列,再用胶水把这样的两个部分:

$output = array_merge_recursive($array['status'], $array['comment']); 
array_walk($output, function (&$value, $key) { $value = empty($value[1]) ? $value[0] : $value[0]."-'".$value[1]."'"; }); 

但这只能在PHP 5.3或更高版本中使用。做同样在PHP的较低版本,您应该先创建功能,然后通过它的名字:

function gluecomments(&$value, $key) { $value = empty($value[1]) ? $value[0] : $value[0]."-'".$value[1]."'"; } 
$output = array_merge_recursive($array['status'], $array['comment']); 
array_walk($output, 'gluecomments'); 

证明:

此输入:

$array = array(
    'status' => array(
     '000046' => 'S', 
     '000047' => 'S', 
    ), 
    'comment' => array(
     '000046' => 'Flarg.', 
     '000047' => '', 
    ), 
    'submit' => 'SUBMIT REPORT', 
); 

print_r($output)打印如下:

Array 
(
    [000046] => S-'Flarg.' 
    [000047] => S 
) 

这可能是你想要的。

编辑:

我已经删除了检查,无论它是一个数组或不 - 我假设变量总是在你已经给我们的格式,所以这不是必需的。

+0

我很好奇,你的基准测试是否与我的答案中的普通“foreach”相比?它有多快? – thirtydot 2011-06-11 14:46:51

相关问题