遍历复杂数组的有效方法

时间:2016-09-04 23:48:22

标签: php arrays

我有一个数据库表,它会返回一个像这样的数组

$roles['admin'] = 'app1,app2,app3';
$roles['moderator'] = 'app2,app3';

现在我想遍历此数组以在我的视图中显示,但我想在每个角色中显示所有角色,而不是在每个角色中显示所有角色。

理想情况下,我希望上面的数组成为这个

$apps['app1'] = 'admin';
$apps['app2'] = 'admin,moderator';
$apps['app3'] = 'admin,moderator';

我一直试图解决这个问题2个小时,但由于某些原因我无法找到一种有效的方法。

2 个答案:

答案 0 :(得分:2)

以下内容将遍历您的数组并将其加载到相应的数组中。它通过遍历数组的每个部分并遍历它来工作。

<?php
$apps = array();
foreach($roles as $key1 => $value1){
  $parts = explode(',', $value1);
  foreach($parts as $key2 => $value2){
   $apps[$value2] .= (strlen($apps[$value2])>0)?",":"").$key1;
  }
}
?>

答案 1 :(得分:1)

您可以使用array_reducearray_keysexplode将一个数组映射到另一个数组,以将CSV值转换为数组

$apps = array_reduce(array_keys($roles), function($apps, $key) use ($roles) {
    foreach (explode(',', $roles[$key]) as $app) $apps[$app][] = $key; 
    return $apps;
}, []);

请注意,结果与您想要的结果略有不同,因为值本身是数组而不是逗号分隔的字符串。

Array
(
    [app1] => Array
        (
            [0] => admin
        )

    [app2] => Array
        (
            [0] => admin
            [1] => moderator
        )

    [app3] => Array
        (
            [0] => admin
            [1] => moderator
        )

)

如果您确实需要CSV值,请添加此

$apps = array_map(function($list) {
    return implode(',', $list);
}, $apps);

产生

Array
(
    [app1] => admin
    [app2] => admin,moderator
    [app3] => admin,moderator
)