PHP Массив с многомерным массивом - УНИКАЛЬНО - PullRequest
0 голосов
/ 26 апреля 2020

В массиве 4500 многомерных массивов. Необходимо отфильтровать их по уникальности по всем ключам (дата, портфель-идентификатор, сумма, значение), но за исключением [идентификатор] => значение , поскольку идентификатор всегда уникальна, а затем возвращается в окончательный массив , Подскажите пожалуйста, как это сделать с минимальной нагрузкой?

✓ - дубликаты

Вход

$array = [
    4482 => [
        "id"           => "4597608",
        "date"         => "2020-03-05", ✓
        "portfolio_ID" => "21177",      ✓
        "summ"         => "597199",     ✓
        "value"        => "RUR"         ✓
    ],
    4483 => [
        "id"           => "4597609",
        "date"         => "2020-03-05",
        "portfolio_ID" => "21177",
        "summ"         => "597199",
        "value"        => "summ"
    ],
    4484 => [
        "id"           => "4597611",
        "date"         => "2020-03-05", ✓
        "portfolio_ID" => "21177",      ✓
        "summ"         => "597199",     ✓
        "value"        => "RUR"         ✓
    ],
    4485 => [
        "id"           => "4597608",
        "date"         => "2020-03-05", ✓
        "portfolio_ID" => "21177",      ✓
        "summ"         => "5954769"
        "value"        => "RUR"         ✓
    ],
    4486 => [
        "id"           => "4597611",
        "date"         => "2020-03-05", ✓
        "portfolio_ID" => "21177",      ✓
        "summ"         => "598655",     
        "value"        => "EUR"         
    ]
];

Выход

$array = [
    4482 => [
        "id"           => "4597608",
        "date"         => "2020-03-05",
        "portfolio_ID" => "21177",
        "summ"         => "597199",
        "value"        => "RUR"
    ],
    4483 => [
        "id"           => "4597609",
        "date"         => "2020-03-05",
        "portfolio_ID" => "21177",
        "summ"         => "597199",
        "value"        => "summ"
    ],
    4485 => [
        "id"           => "4597608",
        "date"         => "2020-03-05",
        "portfolio_ID" => "21177",
        "summ"         => "5954769"
        "value"        => "RUR"
    ],
    4486 => [
        "id"           => "4597611",
        "date"         => "2020-03-05",
        "portfolio_ID" => "21177",
        "summ"         => "598655",     
        "value"        => "EUR"         
    ]
];

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вы можете перевернуть массив, затем l oop it.
В l oop создайте новый массив, ключом которого будут все данные, по которым вы хотите фильтровать.
Поскольку ключи должны быть уникальными, массив будет отфильтрован.

Я удаляю ассоциативные ключи только для того, чтобы сделать массив «красиво выглядящим».

$arr = array_reverse($arr);

foreach($arr as $sub){
    $new[$sub['date'].$sub['portfolio_ID'].$sub['summ'].$sub['value']] = $sub;
}
$new = array_values($new);

var_dump($new);

https://3v4l.org/CKILH

0 голосов
/ 26 апреля 2020

Просто используйте array_filter

$array = [
    4482 => [
        "id"           => "4597608",
        "date"         => "2020-03-05",
        "portfolio_ID" => "21177",
        "summ"         => "597199",
        "value"        => "RUR"
    ],
    4483 => [
        "id"           => "4597609",
        "date"         => "2020-03-05",
        "portfolio_ID" => "21177",
        "summ"         => "597199",
        "value"        => "summ"
    ],
    4484 => [
        "id"          => "4597611",
        "date"         => "2020-03-05",
        "portfolio_ID" => "21177",
        "summ"         => "597199",
        "value"        => "RUR"
    ]
];

$result=[];
array_walk($array, function($item, $key) use(&$result){
    if(count(array_filter($result,function($already_added) use(&$result, $item){
        return $already_added['date']==$item['date'] &&
               $already_added['portfolio_ID']==$item['portfolio_ID'] &&
               $already_added['summ']==$item['summ'] &&
               $already_added['value']==$item['value'];
    }))==0) $result[$key]=$item;
});

var_dump($result);

В приведенном выше примере будет дамп:

array (size=2)
  4482 => 
    array (size=5)
      'id' => string '4597608' (length=7)
      'date' => string '2020-03-05' (length=10)
      'portfolio_ID' => string '21177' (length=5)
      'summ' => string '597199' (length=6)
      'value' => string 'RUR' (length=3)
  4483 => 
    array (size=5)
      'id' => string '4597609' (length=7)
      'date' => string '2020-03-05' (length=10)
      'portfolio_ID' => string '21177' (length=5)
      'summ' => string '597199' (length=6)
      'value' => string 'summ' (length=4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...