Удаление дубликатов и объединение многомерного массива - PullRequest
0 голосов
/ 21 мая 2019

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

Array
(
    [Nishanth] => Array
        (

            [0] => Array
                (
                    [ID] => 3
                    [username] => IronMan
                )

            [1] => Array
                (
                    [ID] => 5
                    [username] => SpiderMan
                )

            [2] => Array
                (
                    [ID] => 8
                    [username] => AntMan
                )

            [3] => Array
                (
                    [ID] => 10
                    [username] => BatMan
                )

            [4] => Array
                (
                    [ID] => 11
                    [username] => SuperMan
                )

        )


    [IronMan] => Array
        (
            [0] => Array
                (
                    [ID] => 1
                    [username] => Nishanth
                )

            [2] => Array
                (
                    [ID] => 5
                    [username] => SpiderMan
                )

        )

    [SpiderMan] => Array
        (
            [0] => Array
                (
                    [ID] => 1
                    [username] => Nishanth
                )

            [1] => Array
                (
                    [ID] => 3
                    [username] => IronMan
                )

            [2] => Array
                (
                    [ID] => 8
                    [username] => AntMan
                )

            [3] => Array
                (
                    [ID] => 10
                    [username] => BatMan
                )

            [4] => Array
                (
                    [ID] => 14
                    [username] => Hulk
                )
        )

    [AntMan] => Array
        (
            [0] => Array
                (
                    [ID] => 1
                    [username] => Nishanth
                )

            [1] => Array
                (
                    [ID] => 10
                    [username] => BatMan
                )
        )

    [BatMan] => Array
        (
            [0] => Array
                (
                    [ID] => 1
                    [username] => Nishanth
                )

            [1] => Array
                (
                    [ID] => 5
                    [username] => SpiderMan
                )

            [2] => Array
                (
                    [ID] => 8
                    [username] => AntMan
                )

            [3] => Array
                (
                    [ID] => 11
                    [username] => SuperMan
                )
        )

    [SuperMan] => Array
        (
            [0] => Array
                (
                    [ID] => 1
                    [username] => Nishanth
                )

            [1] => Array
                (
                    [ID] => 10
                    [username] => BatMan
                )
        )

    [Hulk] => Array
        (
            [0] => Array
                (
                    [ID] => 5
                    [username] => SpiderMan
                )

        )
)

Как мне нужно объединить вышеуказанный массив, как показанониже

Ожидаемый результат:

[MergedUser] => Array
    (
        [0] => Array
            (
                [ID] => 3
                [username] => IronMan
            )

        [1] => Array
            (
                [ID] => 5
                [username] => SpiderMan
            )

        [2] => Array
            (
                [ID] => 8
                [username] => AntMan
            )

        [3] => Array
            (
                [ID] => 10
                [username] => BatMan
            )

        [4] => Array
            (
                [ID] => 11
                [username] => SuperMan
            )

        [5] => Array
            (
                [ID] => 14
                [username] => Hulk
            )
    )

Использование array_unique() будет печатать как есть.Как мы должны достичь этого?

Ответы [ 5 ]

1 голос
/ 21 мая 2019

Вы можете использовать функцию для достижения того же, см. Встроенный документ.

function unique_multidim_array($array, $key)
{
    $temp_array = [];
    $i          = 0;
    $key_array  = [];
    foreach ($array as $val) {
        foreach ($val as $key1 => $value1) {
            if (!in_array($value1[$key], $key_array)) { // will check if already in array
                $key_array[$i]  = $value1[$key]; // once added then wont be added again
                $temp_array[$i] = $value1; // result array
            }
            $i++;
        }
    }
    $ret['MergedUser'] = $temp_array;
    return $ret;
}
$temp = unique_multidim_array($array, "ID"); // unique by which key

Рабочая демо .

1 голос
/ 21 мая 2019
<?php
$people =
[
    [
        [
            'id'=>3,
            'name'=>'George'
        ],
        [
            'id'=>5,
            'name'=>'Ringo'
        ]
    ],
    [
        [
            'id'=>3,
            'name'=>'George'
        ],
        [
            'id'=>7,
            'name'=>'Paul'
        ]
    ],
    [
        [
            'id'=> 9,
            'name'=> 'John'
        ]
    ]
];

$peeps = array_merge(...$people);
$peeps = array_column($peeps, null, 'id');
var_export($peeps);

Выход:

array (
    3 => 
    array (
      'id' => 3,
      'name' => 'George',
    ),
    5 => 
    array (
      'id' => 5,
      'name' => 'Ringo',
    ),
    7 => 
    array (
      'id' => 7,
      'name' => 'Paul',
    ),
    9 => 
    array (
      'id' => 9,
      'name' => 'John',
    ),
  )

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

Спасибо Alive to Die за то, что отметили, что это нарушит ваш оригинальный формат. Поскольку распаковка массива завершается неудачно с использованием строковых ключей, это можно сначала исправить с помощью вызова array_values, поэтому в вашем случае:

$output = array_merge(...array_values($array));
$output = array_column($output, null, 'ID');
1 голос
/ 21 мая 2019

Вы можете использовать array_map и foreach' to remove duplicated from the existing array`

$res['MergedUser'] = [];
array_map(function($v) use (&$res){
 foreach($v as $value){
    if(!array_key_exists($value['ID'], $res['MergedUser']))
        $res['MergedUser'][$value['ID']] = $value;
 }
}, $arr);

Live Demo

1 голос
/ 21 мая 2019

Используйте foreach() вместе с array_values(), как показано ниже:

$final_array = array();

foreach($array as $arr){

    foreach($arr as $a){
        $final_array[$a['ID']]['ID']= $a['ID'];
        $final_array[$a['ID']]['username']= $a['username'];
    }
}

$final_array = array_values($final_array);

print_r($final_array);

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

Ссылка: -

Еогеасп ()

array_values ​​()

0 голосов
/ 21 мая 2019

Вы можете сделать следующее, чтобы создать уникальный массив.

array_unique($YOUR_ARRAY_VARIABLE, SORT_REGULAR);

таким образом, в вашем массиве вместо дублирования есть только уникальное значение.

<?php
 // define array 
 $a = array(1, 5, 2, 5, 1, 3, 2, 4, 5); 

 // print original array 
 echo "Original Array : \n"; 
 print_r($a); 

 // remove duplicate values by using  
 // flipping keys and values 
 $a = array_flip($a); 

 // restore the array elements by again  
 // flipping keys and values. 
 $a = array_flip($a); 

 // re-order the array keys 
 $a= array_values($a); 

 // print updated array 
 echo "\nUpdated Array : \n "; 
 print_r($a); 
?>

Надеюсь эта ссылка поможет вам.

...