функция для имитации левого соединения в массиве не работает должным образом в PHP - PullRequest
1 голос
/ 02 июля 2019

У меня есть два таких массива:

$left = [
    ['UserID' => 6835406],
    ['UserID' => 8418097],
];

$right = [
    ['Amount' => 0.00, 'UserID' => 6835406],
    ['Amount' => 0.00, 'UserID' => 8418097]
];

Я использую эту функцию для выполнения левого соединения с массивами на основе UserID feild:

function left_join_array($left, $right, $left_join_on, $right_join_on = NULL){
    $final= array();

    if(empty($right_join_on))
        $right_join_on = $left_join_on;

    foreach($left AS $k => $v){
        $final[$k] = $v;
        foreach($right AS $kk => $vv){
            if($v[$left_join_on] == $vv[$right_join_on]){
                foreach($vv AS $key => $val)
                    $final[$k][$key] = $val;
            } else {
                foreach($vv AS $key => $val)
                    $final[$k][$key] = NULL;           
            }
        }
    }
   return $final;
}

Я вызываю функцию следующим образом:

$out = $this->left_join_array($left,$right,'UserID','UserID');
echo "<pre>";print_r($out);

и вот результат:

Array
(
    [0] => Array
        (
            [UserID] => 
            [Amount] => 
        )

    [1] => Array
        (
            [UserID] => 8418097
            [Amount] => 0.00
        )

)

, но желаемый результат должен быть таким:

 Array
    (
        [0] => Array
            (
                [UserID] => 6835406
                [Amount] => 0.00
            )

        [1] => Array
            (
                [UserID] => 8418097
                [Amount] => 0.00
            )

    )

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

1 Ответ

1 голос
/ 02 июля 2019

Я не знаю, почему вы сделали такой длинный код, сделайте, как показано ниже:

$finalArray = array();
foreach($left as $lft){
    foreach($right as $rgt){
        if($lft['UserID']  == $rgt['UserID']){
           $finalArray[$lft['UserID']]['UserID'] = $lft['UserID'];
           $finalArray[$lft['UserID']]['Amount'] = (isset($rgt['Amount']) ? $rgt['Amount'] : NULL);
           break;
        }else{
            $finalArray[$lft['UserID']]['UserID'] = $lft['UserID'];
            $finalArray[$lft['UserID']]['Amount'] =  NULL;
        }
    }
}
$finalArray = array_values($finalArray);

var_dump($finalArray);

Выход: - https://3v4l.org/TCnBb

Вы также можете перейти на функциональный подход: https://3v4l.org/aLWij

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