2

我正在尝试翻转数组,但它错过了同名键的值。我必须使用什么来向数组中多次出现的键添加几个值?

例如,对于

[
    "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]的数组中?

4

2 回答 2

3

您必须自己循环并构建一个新数组:

$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);
于 2017-11-30T14:12:42.783 回答
0

一个有点快速和有点hacky的解决方案:

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"
  }
}

注意:使用'??' 需要 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 中的数组元素存在。

于 2017-11-30T14:12:16.813 回答