разделение многомерного массива на PHP - PullRequest
2 голосов
/ 20 декабря 2011

у меня есть многомерный массив

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

тогда я взрываюсь $ 100 *

$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 есть доступ добавить, удалить, посмотреть

Ответы [ 5 ]

2 голосов
/ 20 декабря 2011

Я думаю, что 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";
}

output:

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

Использование регулярных выражений упрощает код, а также несколько упрощает изменение формата поддерживаемых входных данных.

Массив $ result заканчивался хеш-картойиспользуя ваши числовые идентификаторы в качестве ключей и массив разрешений (добавление, удаление и т. д.) в качестве значения для каждого ключа.

1 голос
/ 20 декабря 2011

Попробуйте это (проверено):

// 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";
0 голосов
/ 20 декабря 2011

Вы можете использовать счетчик что-то вроде

  $count5=0;
  foreach($arr_b as $id => $access){
    if($access=='5'){
    $count5++;
    }
  echo $id." have access ".$count5;
 }
0 голосов
/ 20 декабря 2011

А как насчет хэш-карт:

$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 - это хеш-карты. Хеш-карту можно интерпретировать как массив, в котором ключами может быть что угодно, а значением может быть тоже что угодно. В этом случае вы хотели бы использовать хэш-карту, потому что вам нужно связать значения, которые находятся «вне» диапазона массива (даже если они являются целыми числами). Таким образом, хеш-карта - это именно то, что вам нужно, позволяя указать что-либо в качестве ключа.

Как работает хэш-карта , которую вы можете искать в Google или в Википедии. Как работают массивы в php здесь

0 голосов
/ 20 декабря 2011
$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++;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...