Отсутствуют значения из того же ключа после использования функции array_flip

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

Например, для

[
"Input.txt" => "Randy",
"Code.py" => "Stan",
"Output.txt" => "Randy"]

функция groupByOwners должна вернуть

[
"Randy" => ["Input.txt", "Output.txt"],
"Stan" => ["Code.py"]
]

Текущий код:

class FileOwners
{
static $files;
public static function groupByOwners($files)
{
$flip = array_flip($files);
print_r($flip);
}
}

$files = array
(
"Input.txt" => "Randy",
"Code.py" => "Stan",
"Output.txt" => "Randy");

Моя функция возврата Array ( [Randy] => Output.txt [Stan] => Code.py ) NULL,

Так что значение «Input.txt» отсутствует. Это должен быть один и тот же ключ для обоих значений, так как я могу поместить «Input.txt» с «Output.txt» в массив для ключа [Randy]?

2

Решение

Вам придется сделать это самостоятельно и создать новый массив:

$files = array(
"Input.txt" => "Randy",
"Code.py" => "Stan",
"Output.txt" => "Randy");

$new_files = array();

foreach($files as $k=>$v)
{
$new_files[$v][] = $k;
}

print_r($new_files);
2

Другие решения

Несколько быстрое и немного хакерское решение:

php >  $files = array
php >     (
php (         "Input.txt" => "Randy",
php (         "Code.py" => "Stan",
php (         "Output.txt" => "Randy"php (     );
php > var_dump(array_reduce(array_keys($files), function($p, $c) use (&$files) { $p[$files[$c]] = $p[$files[$c]] ?? []; $p[$files[$c]][] = $c; return $p;  }, []));
array(2) {
["Randy"]=>
array(2) {
[0]=>
string(9) "Input.txt"[1]=>
string(10) "Output.txt"}
["Stan"]=>
array(1) {
[0]=>
string(7) "Code.py"}
}

NB: использование «??» требует PHP 7.0.

Просто чтобы вытащить важную часть из однострочника и сделать его хотя бы чуть более читабельным:

array_reduce(array_keys($files), function($p, $c) uses (&$files) {
$p[$files[$c]] = $p[$files[$c]] ?? [];
$p[$files[$c]][] = $c;
}, []);

Вы также можете легко использовать логику if (isset (…)), чтобы убедиться, что элемент массива в $ p существует.

0