我有一个post数组,需要从它创建一个新的数组格式,以存储在数据库中的批插入。我用下面的代码实现了这一点。但是想要一个更好的解决方案(如果有的话)来实现我的数组。我想消除内部循环,但没有得到任何解决方案。请提供我如何实现这一点的任何建议。
解析数组的代码:
if ($this->input->post()) {
foreach ($this->input->post() as $key => $value) {
$i = 0;
/* need to eliminate this loop */
foreach ($value as $k => $v) {
$postData[$i][$key] = $v;
$i++;
}
}
}输入数组:
Array
(
[category_id] => Array
(
[0] => 1
[1] => 4
)
[pay_type_id] => Array
(
[0] => 2
[1] => 5
)
[frequency_id] => Array
(
[0] => 3
[1] => 6
)
)输出数组;
Array
(
[0] => Array
(
[category_id] => 1
[pay_type_id] => 2
[frequency_id] => 3
)
[1] => Array
(
[category_id] => 4
[pay_type_id] => 5
[frequency_id] => 6
)
)发布于 2017-09-19 21:24:14
如果你真的想这样做,你可以完全不用循环:
$input = $this->input->post();
$keys = array_keys($input);
$postData = [
array_combine($keys, array_column($input, 0)),
array_combine($keys, array_column($input, 1)),
];这将产生与您的示例相同的$postData输出,假设输入的内部数组中只有键0和1,就像您的示例一样。如果内部数组中可能的元素数是未知的,那么您可能需要在其上引入一个循环,但仍然可以避免二级循环。
我不得不使用array_combine()和array_column(),因为array_column()本身并不保留您的数组顶层的命名键。
也可能存在使用array_map()或array_walk()的其他解决方案。
然而,虽然它很简短,但读者并不清楚它在做什么,所以除非您清楚地记录它,否则从长远来看,您将给自己带来一个令人头疼的维护问题。
双循环是一种更容易理解的解决方案,非常标准,不会给您带来任何问题。因此,虽然我已经为您提供了一个解决方案,但实际上我建议您只使用您已有的代码。
发布于 2017-09-19 20:35:14
因为您有两个数组,a:“记录”和b:“字段”,在任何情况下,从理论上讲,您至少需要两个循环来填充记录中的“记录”和“字段”。而且,基本上,这不是一个糟糕的方法或问题。
如果你真的只想要一个循环,因为信念的原因,你需要在填充记录的第一个循环中放置一个硬编码的字段赋值列表。
发布于 2017-09-19 20:48:42
我能看到的不需要第二个数组的唯一方法是这样:
$arr = array("category_id" => array(1, 4), "pay_type_id" => array(2, 5), "frequency_id" => array(3, 6));
foreach ($arr as $key => $value) {
$postData[0][$key] = $value[0];
$postData[1][$key] = $value[1];
}
print_r($postData);但是使用这种方法会失去灵活性,因为您必须事先知道内部数组中将有多少索引。使其足够通用以应对数据更改的唯一方法是使用与最初类似的内部循环。
您的原始代码没有太大问题,这是在这种情况下更改数组格式的一种非常标准和合理的方法。它应该不会给您带来任何特别的性能问题,即使对于相当大的数组,也没有更好的方法来解决它。
https://stackoverflow.com/questions/46300453
复制相似问题