Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 遍历复杂数组的有效方法_Php_Arrays - Fatal编程技术网

Php 遍历复杂数组的有效方法

Php 遍历复杂数组的有效方法,php,arrays,Php,Arrays,我有一个数据库表,它将返回类似这样的数组 $roles['admin'] = 'app1,app2,app3'; $roles['moderator'] = 'app2,app3'; 现在我想遍历此数组以显示在我的视图中,但我不想显示每个角色内的所有应用程序,而是希望显示每个应用程序内的所有角色 理想情况下,我希望上面的数组变成这样 $apps['app1'] = 'admin'; $apps['app2'] = 'admin,moderator'; $apps['app3'] = 'admi

我有一个数据库表,它将返回类似这样的数组

$roles['admin'] = 'app1,app2,app3';
$roles['moderator'] = 'app2,app3';
现在我想遍历此数组以显示在我的视图中,但我不想显示每个角色内的所有应用程序,而是希望显示每个应用程序内的所有角色

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

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

我已经尝试解决这个问题两个小时了,但由于某些原因,我找不到一种有效的方法来解决这个问题。

您可以使用将一个数组映射到另一个数组,并将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
)

您可以使用和将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
)

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

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

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

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

这里的所有代码都是为数组赋值。预期的行为是什么?你想让代码做什么,而它目前没有做什么?“映射”,你想把数组映射到另一种形式mult-d数组会比字符串值除数器容易吗?这对foreach和explode来说真的没有那么难…你应该展示你尝试过的不起作用的东西。这里代码所做的就是为数组赋值。预期的行为是什么?你想让代码做什么,而它目前没有做什么?“映射”,你想把数组映射到另一种形式mult-d数组会比字符串值除数器容易吗?这对foreach和explode来说真的没有那么难…你应该展示你尝试过的不起作用的东西。这太完美了,非常感谢:)这太完美了,非常感谢:)