【问题标题】:convert hard coded array merging functionality to dynamic code in PHP将硬编码数组合并功能转换为 PHP 中的动态代码
【发布时间】:2019-10-30 10:03:04
【问题描述】:

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

$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 数组执行以下操作,以使其长度等于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 类似:

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

并且这个函数应该返回提到的输出。或者任何其他更好的解决方案也会非常有帮助。

我无法弄清楚如何以一种简洁的方式完成此操作。

对此的任何建议都会非常有帮助。 我该怎么做?

【问题讨论】:

  • 似乎真正需要更改的唯一值是您帐户的ID。你为什么不这样做:array_column($output_data3, $2nd_param);array_search($values[$2nd_param], $left_join_on_next); .etc。其中$2nd_paramID
  • 我建议您使用我在stackoverflow.com/a/56559802/6487675 的解决方案,这样,添加第 3 个或第 4 个数组很容易

标签: php arrays codeigniter sorting optimization


【解决方案1】:

正如你所说,你可以使用一个函数 (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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2011-11-15
    • 1970-01-01
    • 2020-09-02
    • 2015-03-18
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多