【问题标题】:multi dimension array split with explode PHP用explode PHP拆分多维数组
【发布时间】:2011-12-20 16:47:36
【问题描述】:

我有一个多维数组

$a = "5,add|4,edit|6,add|6,edit|19,add|19,delete|19,view";

然后我爆炸$a

$array_a = explode("|", $a);

//loop

for($i=0;$i<=count($arr_a)-1;$i++){

    arr_b = explode(",", $arr_a[$i]);

    foreach($arr_b as $id => $access){
        echo $id." have access ".$access;
    }
}

//result 
0 have access 5
1 have access add
0 have access 4
1 have access edit
0 have access 6
1 have access add
0 have access 6
1 have access edit
0 have access 19
1 have access add
0 have access 19
1 have access delete
0 have access 19
1 have access view
//-end result

问题是:

我怎样才能得到这样的结果

5 可以访问添加
4 有权限编辑
6 可以访问添加、编辑
19 可以访问添加、删除、查看

【问题讨论】:

  • 为什么要使用 for 循环遍历 $arr_a,然后使用 foreach 遍历 $arr_b。为什么不同时使用 foreach 呢?

标签: php arrays arraylist


【解决方案1】:

我认为 Regex 在这种情况下会是一个更好的解决方案,以防你没有考虑使用它。

样本(已测试):

$a = "5,add|4,edit|6,add|6,edit|19,add|19,delete|19,view";

$result = array();

// match each pair in the input
if (preg_match_all('/(\\d+)\\,(.*?)(\\||$)/m', $a, $matches)){

    foreach( $matches[1] as $match_index => $match ){

        $result[$match][] = $matches[2][$match_index];

    }

}

// loop through the results and print in desired format
foreach( $result as $entry_index => $entry ){
    echo "$entry_index have access " . implode( ',', $entry ) . "\n";
}

输出:

5 have access add
4 have access edit
6 have access add,edit
19 have access add,delete,view

使用正则表达式可以简化代码,也可以更轻松地更改支持的输入格式。

$result 数组最终得到一个哈希映射,使用您的数字 id 作为键,权限数组(添加、删除等)作为每个键的值。

【讨论】:

  • 我不确定正则表达式是否显着简化了事情/有助于此处的可维护性,而不是我建议的“两次爆炸”解决方案......而是IMO的口味问题。至少,与许多其他提议的解决方案不同,这个解决方案足够清晰并且有效 :) +1
【解决方案2】:

试试这个(已测试):

// intial data
$strAccess = "5,add|4,edit|6,add|6,edit|19,add|19,delete|19,view";

// build access array
$arrayAccess = array();

$tmpList = explode('|', $strAccess);

foreach($tmpList as $access)
{
  list($idUser, $right) = explode(',', $access);

  if (!isset($arrayAccess[$idUser]))
    $arrayAccess[$idUser] = array();

  $arrayAccess[$idUser][] = $right;
}

// print it out
foreach($arrayAccess as $idUser => $accessList)
  echo $idUser." has access ".implode(",", $accessList)."\n";

【讨论】:

  • 我可以相信这段代码!很神奇!它帮助了我,谢谢兄弟!
【解决方案3】:

你可以使用类似的计数器

  $count5=0;
  foreach($arr_b as $id => $access){
    if($access=='5'){
    $count5++;
    }
  echo $id." have access ".$count5;
 }

【讨论】:

    【解决方案4】:
    $a = "5,add|4,edit|6,add|6,edit|19,add|19,delete|19,view";
    $array_a = explode("|". $a);
    
    //loop
    $aRights = array();
    for($i=0;$i<=count($arr_a)-1;$i++){ $arr_b = explode(",", $arr_a[$i]);
    
         foreach($arr_b as $id => $access){
            $aRights[$id][] = $access;
         }
    }
    
    foreach( $aRights as $id=>$rightsList){
        echo $id." have access ";
        $i=1;
        foreach($rightsList as $r){
    
           echo $r;
           if($i != count($rightsList)) echo ",";
           $i++;
       }
    }
    

    【讨论】:

    • $aRights[id] 肯定会抛出“未定义常量”警告。
    • 我只是试了一下,但结果空白..有人可以帮我解决这个问题吗?
    • 您是否包含了原始字符串?那不在那里...我只是添加它。
    【解决方案5】:

    像哈希映射这样的东西呢:

    $tobegenerated = array();
    $a = explode(yourdelimiter,yourstring);
    foreach ($a as $cur)
    {
        $b = explode(delimiter,$cur);
        $tobegenerated[$cur[0]] = $cur[1];
    }
    //Print hashmap $tobegenerated
    

    这应该可行,记住在 php 数组中也是哈希映射

    编辑 1: PHP 中的数组是哈希映射。哈希映射可以解释为一个数组,其中键可以是任何东西,值也可以是任何东西。在这种情况下,您希望使用哈希映射,因为您需要绑定数组范围“外部”的值(即使它们是整数)。因此,哈希映射正是您想要的,允许将任何内容指定为键。

    hash map 的工作原理可以在 google 或 wikipedia 上搜索。 php中数组是如何工作的可以查看here

    【讨论】:

    • 我不明白无法解释更多细节?
    • 查看我的编辑,有解释。您可以在我链接的 PHP 数组页面上找到数组示例。
    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2018-02-27
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多