消除PHP循环

时间:2017-09-19 12:26:50

标签: php arrays

我有一个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
            )

    )

4 个答案:

答案 0 :(得分:1)

如果你真的想要,你可以完全没有循环:

$input = $this->input->post();
$keys = array_keys($input);
$postData = [
    array_combine($keys, array_column($input, 0)),
    array_combine($keys, array_column($input, 1)),
];

这将给出与示例相同的$postData输出,假设输入在内部数组中只有键01,就像在您的示例中一样。如果内部数组中可能的元素数量未知,那么您可能需要在其上引入一个循环,但仍然可以避免使用辅助循环。

我必须使用array_combine()以及array_column()作为array_column(),因为它本身不会将命名键保留为数组的顶级。

使用array_map()array_walk()的其他解决方案也可能存在。

然而,尽管它简洁明了,但读者并不清楚它是在理解它在做什么,所以除非你清楚地记录它,否则你将长期为自己造成维护问题。

双循环是一个更容易理解的解决方案,非常标准,并且不会给您带来任何问题。所以,虽然我已经给你一个解决方案,但我实际上建议你只使用你已经拥有的代码。

答案 1 :(得分:0)

因为你有两个数组,一个:"记录"和b:"字段"在任何情况下,理论上,你需要至少两个循环来填充"记录"和"字段"在记录里面。而且,基本上,这不是一个糟糕的方法或问题。

如果您真的只想要一个循环,由于信仰原因,您需要在填充记录的第一个循环中放置一个硬编码的字段分配列表。

答案 2 :(得分:0)

我没有第二个数组就可以看到这样做的唯一方法是:

$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);

但是这种方法会失去灵活性,因为你必须事先知道内部数组中有多少索引。使其足够通用以应对数据变化的唯一方法是使用类似于你最初的方式的内循环。

您的原始代码没有什么问题,在这种情况下更改数组格式是一种非常标准和合理的方法。它不应该给你任何特定的性能问题,即使是相当大的数组,也没有任何更简洁的方法来处理它。

答案 3 :(得分:0)

根据您的输出,您还需要第二个循环。但是,您可以取消$i的使用,而不是使用$k。 您可以将代码更改为:

if ($this->input->post()) {
    foreach ($this->input->post() as $key => $value) {
        foreach ($value as $k => $v) {
            $postData[$k][$key] = $v;
        }
    }
}

DEMO