преобразовать функцию слияния жестко закодированных массивов в динамический код на PHP - PullRequest
0 голосов
/ 16 июня 2019

У меня есть такой массив массивов, который я получаю из ответа сервера:

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

)

Я объясню, как я получаю вывод.Во всех массивах data1, data2 и data3 первая строка - это имя столбцов , а остальные строки содержат данные для этих столбцов . Сначала я беру массив, максимальная длина которого в массиве $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
        )

)

После этого я выполняю следующую операцию с массивами data2 и data3, чтобы их длина равнялась длине 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");

и эта функция должна вернутьупомянутый вывод.Или любое другое лучшее решение также было бы очень полезно.

Я не могу понять, как это можно сделать аккуратно.

Любые предложения по этому вопросу будут действительно полезны.Как мне это сделать?

1 Ответ

0 голосов
/ 16 июня 2019

Как вы упомянули, вы можете использовать функцию (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;
}

Вы можете вызывать функцию в цикле (в то время как / для /и т.д.) dataJoinStep1($data)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...