Первое значение дублируется в массиве при использовании функции array_search - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь удалить дубликаты из двумерного массива на основе идентификатора клиента.Сценарий удаляет все дубликаты, КРОМЕ первого значения, первого клиента.

Я попробовал еще несколько способов сравнения результата из array_search с разными значениями, пытаясь использовать! == и === без многообещающего результата.

Вставка не числового значения как первого в массиве делает все безупречно дедуплицирующим.

Вот код:

// Build client list
$ClientList = array();
$counter = 0;
foreach ($ClientTrans as $order => $value) {
    $ClientId = $ClientTrans[$order]['customer_id'];
if (array_search($ClientId, array_column($ClientList, 0)) == FALSE && is_numeric($ClientId)) {
        $ClientList[$counter][] = $ClientId;
        $counter += 1;
    }
}

Окончательный результат - клиент и суммазначение из двухмерного массива.Все работает как надо, за исключением первого клиента, который несколько раз появляется в списке клиентов новой сборки без дубликатов.

Вот входной массив

Array ( 
    [0] => Array ( 
            [customer_id] => 50245901 
            [points] => 299 
    ) 
    [1] => Array ( 
            [customer_id] => 50245907 
            [points] => 3847 
    ) 
    [2] => Array (
            [customer_id] => 50245908 
            [points] => 159 
    ) 
    [3] => Array ( 
            [customer_id] => 50245910 
            [points] => 3175 
    ) 
    [4] => Array ( 
            [customer_id] => 50245914 
            [points] => 641 
    ) 
    [5] => Array ( 
            [customer_id] => 50245916 
            [points] => 449 
    ) 
    [6] => Array ( 
            [customer_id] => 50245921 
            [points] => 551 
    ) 
    [7] => Array ( 
            [customer_id] => 50245927 
            [points] => 0 
    ) 
    [8] => Array ( 
            [customer_id] => 50245928 
            [points] => 602 
    ) 
    [9] => Array ( 
            [customer_id] => 50245929 
            [points] => 495 
    )
    [10] => Array ( 
            [customer_id] => 50245931 
            [points] => 539 
    ) 
    [11] => Array ( 
            [customer_id] => 50245941 
            [points] => 0 
    ) 
    [12] => Array ( 
            [customer_id] => 50245901 
            [points] => 124 
    ) 
    [13] => Array ( 
            [customer_id] => 50245901 
            [points] => 512 
    )
)

И желаемый результат - идентификатор клиента 50245901не появляется несколько раз:

Array ( 
    [0] => Array ( 
            [customer_id] => 50245901 
    ) 
    [1] => Array ( 
            [customer_id] => 50245907 
    ) 
    [2] => Array ( 
        [customer_id] => 50245908 
    ) 
    [3] => Array ( 
        [customer_id] => 50245910 
    ) 
    [4] => Array ( 
        [customer_id] => 50245914 
    ) 
    [5] => Array ( 
        [customer_id] => 50245916 
    ) 
    [6] => Array ( 
        [customer_id] => 50245921 
    ) 
    [7] => Array ( 
        [customer_id] => 50245927 
    ) 
    [8] => Array ( 
        [customer_id] => 50245928 
    ) 
    [9] => Array ( 
        [customer_id] => 50245929 
    ) 
    [10] => Array ( 
        [customer_id] => 50245931 
    )
)

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Вы можете просто написать код,

$arr = array_values(array_unique(array_column($arr, 'customer_id')));
$temp = [];
array_walk($arr, function(&$item,$key) use(&$temp){
    $temp[]['customer_id'] = $item; 
});
print_r($temp);

array_values ​​ - вернуть все значения массива
array_unique - Удаляет повторяющиеся значения из массива
array_column - вернуть значения из одного столбца во входном массиве
array_walk - применить пользовательскую функцию к каждому члену массива

Демо .

1 голос
/ 04 апреля 2019

Вам нужно упростить foreach(), как показано ниже: -

$ClientList = array();

foreach ($ClientTrans as $order => $value) {
    $ClientList[$value['customer_id']]['customer_id'] = $value['customer_id'];
}
$ClientList = array_values($ClientList);

Вывод: - https://3v4l.org/f7Bfn

...