按键对二维数组中的行数据进行分组,以创建关联数组并使用 Laravel 的集合方法删除重复值

问题描述 投票:0回答:2

如何使用 Laravel 集合进行以下操作

我们得到了这个数组:假设我们事先不知道任何键的名称。

$input = [
    ['name' => 'John McClane', 'age' => '40'],
    ['name' => 'John McClane', 'age' => '50'],
    ['name' => 'Hans Gruber', 'age' => '40'],
    ['name' => 'Hans Gruber', 'age' => '50'],
    ['name' => 'Holly McClane', 'age' => '20'],
    ['name' => 'Holly McClane', 'age' => '49'],
];

$output = [
    'name' => [
        'John McClane',
        'Hans Gruber',
        'Holly McClane'
    ],
    'age' => [
        '40',
        '50',
        '20',
        '49'
    ]
];

更新:@Felippe Duarte 添加了有关如何执行此操作的 PHP 普通版本。

$output = [];
foreach ($input as $arr) {
    $keys = array_keys($arr);
    foreach ($keys as $key) {
        $output[$key] =  array_unique(array_column($input, $key));
    }
}

只需更换

array_unique(array_column($input, $key));

$input->pluck($key)->toArray();
不是很有趣。

我想知道,有没有一种巧妙的方法可以完全用一行 Laravel 集合来实现这一点?

按二级键分组,每组都有唯一的值。

php laravel laravel-5 collections grouping
2个回答
2
投票

使用普通 PHP,您可以使用 array_columnarray_unique:

$output = [
    'name' => array_unique(array_column($input, 'name')),
    'age' => array_unique(array_column($input, 'age')),
];

通过收藏,您可以使用pluckunique

$output = [
    'name' => $input->pluck('name')->unique(),
    'age' => $input->pluck('age')->unique(),
];

如果您不知道按键,请使用 array_keyskeys(),获取按键,然后重复上述过程:

$keys = array_keys($input); //$input->keys();

foreach ($keys as $key) {
    $output[$key] = $input->pluck($key)->unique();
}

0
投票

要按所有遇到的列动态分组,然后删除单个方法链中每个组中的重复值,我想出了这个:

代码:(PHPize演示

var_export(
    collect($input)
    ->reduce(fn($result, $row) => $result->mergeRecursive($row), collect()) // form groups
    ->map(fn($row) => collect($row)->unique()->values()) // remove dupes, then re-index
    ->toArray()
);
© www.soinside.com 2019 - 2024. All rights reserved.