我有一个提交检查点报告的表单。每个检查点都有一个"状态"和一个"注释"。表单被设置为返回一个多维数组,关键字是检查点ID,如下所示:
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"
}
做这件事最有效的方法是什么?。
给定$array
和$array2
您的两个阵列
$result = array();
foreach( $array as $k=>$v ) {
$result[$k] = $v;
if (isset($array2[$k]))
$result[$k] .= '-' . $array2[$k];
}
print_r($result);
没有本机PHP函数可以为您做到这一点(这将是最有效的)。只需在两个数组中循环并开始收集即可。
一个代码示例是侮辱性的,所以我省略了它。
如果$checkpoints
是问题中列出的array
,您可以使用:
$newCheckpoints = array();
foreach ($checkpoints['status'] as $k => $status) {
$newCheckpoints[$k] = $status . (!empty($checkpoints["comment"][$k]) ? "-'{$checkpoints['comment'][$k]}'" : '');
}
首先递归地合并带有状态和注释的数组,然后像这样粘合这两个部分:
$output = array_merge_recursive($array['status'], $array['comment']);
array_walk($output, function (&$value, $key) { $value = empty($value[1]) ? $value[0] : $value[0]."-'".$value[1]."'"; });
但这只能在5.3或更高版本的PHP中使用。要在较低版本的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
)
这可能正是你想要的。
编辑:
我已经删除了检查,无论它是否是数组——我假设变量总是按照您给我们的格式,所以这不是必需的。