Как разделить значения массива, сгруппировать по первой подстроке и объединить значения второй подстроки? - PullRequest
0 голосов
/ 21 сентября 2018

Я работаю над сенчей и php.Данные возвращаются из sencha в виде массива:

$permissionArr = Array([0] =>1_2 ,[1] =>"1_3", [2] =>1_4, [3] =>2_3, [4] =>"2_4",[5] =>"2_5");

Я хочу создать массив, используя значения вышеуказанного массива.

array[
    [0]=>[
       'moduleId' => 1,
       'permission' => '2,3,4'
    ]
]

Я пытался решить, но я думаю, что я не иду по правильному пути.

$permissionArr = Array("0" =>1 ,"1" =>"1_3", "2" =>2, "3" =>3, "4" =>"3_1","5" =>"3_2","6" =>4,"7" =>"4_1"); 
$finalArr = array();
foreach($permissionArr as $key => $value) {                     
    if(stristr( $value, '_') ){
        array_push($finalArr, $value);
    } 
} 
$aa = array();
foreach($finalArr as $key => $val){
    $permissionArray = explode( '_', $val); 
    array_push($aa, $permissionArray);
}

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Вот, пожалуйста:

<?php

$permissionArr = array("0" =>1 ,"1" =>"1_3", "2" => "1_4", "3" => "3", "4" =>"3_1","5" =>"3_2","6" =>"4","7" =>"4_1");

$groupedPermArr = array_reduce(
    $permissionArr,
    function ($output, $value) {
        $values = explode('_', $value);

        $output[$values[0]]['module_id'] = $values[0];

        if (isset($values[1])) {
            $output[$values[0]]['permission'][] = $values[1];
        }

        return $output;
    },
    []
);

$stringifiedPermArr = array_map(
    function ($value) {
        $value['permission'] = implode(',', array_unique($value['permission']));

        return $value;
    },
    $groupedPermArr
);

var_dump($stringifiedPermArr);

Объяснение: 1. Сначала создайте массив массивов с ключами «module_id» и «Права доступа».2. Затем выполните итерацию по этому массиву, убедитесь, что разрешения уникальны, и объедините их с разделителем.

0 голосов
/ 21 сентября 2018

По этому алгоритму вы получите все модули с перми.Если не будет никакого разрешения, то у вас будет пустой массив.Его хороший идентификатор нужен для проверки модуля perm, и у вас всегда будут данные модуля.

// input array
$permissionArr = Array("0" =>1 ,
"1" =>"1_3", 
"2" =>"1_4", 
"3" =>3, 
"4" =>"3_1",
"5" =>"3_2",
"6" =>4,
"7" =>"4_1");

//walk over array and form a new one with module id as key and perm as value array
foreach($permissionArr as $value){
    $data = explode('_',$value);
    $permission = $data[1]??null;
    if($permission){
        $raw[$data[0]][] = $permission;
    }else{
        if(!isset($raw[$data[0]])){
            $raw[$data[0]] = [];
        }
    }
}

// transform new array in desired form 
$result = array_walk($raw, function(&$val, $key){
    $val = ['moduleId' => $key, 'permission' => implode(",",$val)] ;  
}, $raw);

print_r($raw);
0 голосов
/ 21 сентября 2018

Процесс:

  • итерация значений массива
  • игнорирование значений без данных разрешения
  • использование значений module_id в качестве временных ключей
  • определение того,каждое текущее значение является первым вхождением module_id или не использует isset().
  • , если 1-е, сохраните оба значения
  • , если не 1-е, добавьте существующее значение разрешения через запятую и новое значение разрешения.
  • после завершения цикла переиндексировать массив результатов с помощью array_values().

Код: ( Demo )

$permissionArr = ["1", "1_3", "1_4", "3", "3_1", "3_2","4", "4_1"];  

foreach($permissionArr as $v) {
    if(strpos($v, "_") !== false) { // logically you could safely omit "!== false" here
        $x = explode("_", $v);
        if (!isset($result[$x[0]])) {
            $result[$x[0]] = ['module_id' => $x[0], 'permission' => $x[1]];
        } else {
            $result[$x[0]]['permission'] .= ",$x[1]";
        }
    }
}

var_export(array_values($result));

Вывод:

array (
  0 => 
  array (
    'module_id' => '1',
    'permission' => '3,4',
  ),
  1 => 
  array (
    'module_id' => '3',
    'permission' => '1,2',
  ),
  2 => 
  array (
    'module_id' => '4',
    'permission' => '1',
  ),
)

ps Относительно stristr() ...

  1. Вам не нужна нечувствительность к регистру, исходящая от i в функции.
  2. В руководстве по php на странице strstr() есть примечание, в котором говорится, что когда вы просто проверяете наличие подстроки в строке, strpos() - это более легкий / более эффективный вызов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...