将硬编码的数组合并功能转换为PHP中的动态代码

时间:2019-06-16 16:23:19

标签: php arrays codeigniter sorting optimization

我有一个这样的数组数组,可以从服务器的响应中得到:

$data = array (
        'data1' => array (
            0 => 
            array (
                0 => 'ID',
                1 => 'PinCode',
                2 => 'Date',
                ),
            1 => 
            array (
                0 => '101',
                1 => '454075',
                2 => '2012-03-03',
                ),
            2 => 
            array (
                0 => '103',
                1 => '786075',
                2 => '2012-09-05',
                ),
            ),
        'data2' => array (
            0 => 
            array (
                0 => 'Balance',
                1 => 'ID',
                ),
            1 => 
            array (
                0 => '4533',
                1 => '101',
                )
            ),
        'data3' => array (
            0 => 
            array (
                0 => 'Active',
                1 => 'ID',
                ),
            1 => 
            array (
                0 => 'Yes',
                1 => '101',
                ),
            2 => 
            array (
               0 => 'No',
               1 => '103',
              ),
            ),
        );

在上面的数组上,我执行了一种左连接操作,以得到下面的最终输出:

    Array
(
    [0] => Array
        (
            [ID] => 101
            [PinCode] => 454075
            [Date] => 2012-03-03
            [Balance] => 4533
            [Active] => Yes
        )

    [1] => Array
        (
            [ID] => 103
            [PinCode] => 786075
            [Date] => 2012-09-05
            [Balance] => 0
            [Active] => No
        )

)

我将解释如何获得输出。 在所有数组data1data2data3中,第一行是列的名称,而其余行包含这些列的数据首先,我在$data数组中使用长度最大的数组。因此,我首先从$data中选择data1数组,因为其长度为3。 使用以下代码:

$data1=$data['data1'];
$columns_data1 = $data1[0];
for($i=1;$i<=(count($data1)-1);$i++)
    {
        $output_data1[] = array_combine($columns_data1,$data1[$i]);
    }
echo print_r($output_data1);

我得到这样的输出$output_data1

Array
(
    [0] => Array
        (
            [ID] => 101
            [PinCode] => 454075
            [Date] => 2012-03-03
        )

    [1] => Array
        (
            [ID] => 103
            [PinCode] => 786075
            [Date] => 2012-09-05
        )

)

此后,我对data2data3数组执行以下操作,以使它们的 length等于data1 length - 1的长度,即排除包含列名称的第一行

$data2=$data['data2'];
    $columns_data2 = $data2[0];
    for($i=1;$i<=(count($data1)-1);$i++)
    {
        if($i<count($data2))
        $output_data2[] = array_combine($columns_data2,$data2[$i]);
        else
         $output_data2[]=array_combine($columns_data2,array('0'=>'0','1'=>'0')); //add the value as 0 to the rows and make the length equal to that of data1. Here I've take index 0 and 1 because first row in data contains two index i.e Balance and ID.

    }
echo print_r($output_data2);

此代码为data2提供以下输出:

Array
(
    [0] => Array
        (
            [Balance] => 4533
            [ID] => 101
        )

    [1] => Array
        (
            [Balance] => 0
            [ID] => 0
        )

)

data3的silimary:

$data3=$data['data3'];
$columns_data3 = $data3[0];
for($i=1;$i<=(count($data1)-1);$i++)
{
    if($i<count($data3))
    $output_data3[] = array_combine($columns_data3,$data3[$i]);
    else
     $output_data3[]=array_combine($columns_data3,array('0'=>'0','1'=>'0'));

}
echo "<pre>"; print_r($output_data3);

给出输出:

Array
(
    [0] => Array
        (
            [Active] => Yes
            [ID] => 101
        )

    [1] => Array
        (
            [Active] => No
            [ID] => 103
        )

)

接下来,我将结合$output_data1$output_data2

$left_join_on = array_column($output_data2, "ID");
    $first_leftjoin_output = array();
    foreach($output_data1 as $values){
        $key = array_search($values['ID'], $left_join_on);
            if($key ===false){
                    $key = array_search(0, $left_join_on);
            }
            unset($output_data2[$key]['ID']);
            $first_leftjoin_output[] = array_merge($values,$output_data2[$key]);
    }

    echo "<pre>"; print_r($first_leftjoin_output);

给出输出:

Array
(
    [0] => Array
        (
            [ID] => 101
            [PinCode] => 454075
            [Date] => 2012-03-03
            [Balance] => 4533
        )

    [1] => Array
        (
            [ID] => 103
            [PinCode] => 786075
            [Date] => 2012-09-05
            [Balance] => 0 //added 0 to balance as ID 103 didn't existed in output_data2. just like a left join of sql
        )

)

接下来,我将在$first_leftjoin_output$output_data3上加入联接

$left_join_on_next = array_column($output_data3, "ID");
    $second_leftjoin_output = array();
    foreach($first_leftjoin_output as $values){
        $key = array_search($values['ID'], $left_join_on_next);
            if($key ===false){
                    $key = array_search(0, $left_join_on_next);
            }
            unset($output_data3[$key]['ID']);
            $second_leftjoin_output[] =         array_merge($values,$output_data3[$key]);
    }
echo "<pre>"; print_r($second_leftjoin_output);

这一步给出了最终输出$second_leftjoin_output,我已经在问题的开头提到了。

Array
(
    [0] => Array
        (
            [ID] => 101
            [PinCode] => 454075
            [Date] => 2012-03-03
            [Balance] => 4533
            [Active] => Yes
        )

    [1] => Array
        (
            [ID] => 103
            [PinCode] => 786075
            [Date] => 2012-09-05
            [Balance] => 0
            [Active] => No
        )

)

因此,我根据匹配的ID字段离开了所有三个数组。 如您所见,我正在以硬编码方式进行所有这些操作。 如果我的$data array包含data4,那么我将再次添加代码以获取$third_leftjoin_output

我希望这个过程是动态的。

我想要一个动态的解决方案,使得我只需要传递$ data数组和左联接将基于的领域名称即可。

类似这样的东西:

$output = left_join_function($data,"ID");

,此函数应返回上述输出。或任何其他更好的解决方案也将非常有帮助。

我无法弄清楚如何做到这一点。

任何有关此的建议将非常有帮助。 我该怎么做?

1 个答案:

答案 0 :(得分:0)

如前所述,您可以使用函数(https://www.php.net/manual/de/functions.user-defined.php

function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
    echo "Example function.\n";
    return $retval;
}

为您服务:

function dataJoinStep1($array)
{
    // Do something with your array, left join etc.
    return $array;
}

您可以在循环中(while / for / etc)调用函数dataJoinStep1($data)