2014-11-21 3 views
0

Добрый вечер,Поиск 4 уровня вложенности массив в PHP

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

Вот сделка с неактуальной информацией опущен:

Array 
(

... other stuff ... 

[user_groups] => Array 
    (
     [0] => Array 
      (
       [GroupUsersId] => 4 
       [GroupUsersName] => XXXX 
       [idUserType] => 2 
       [NameTypeUser] => Manager 
       [DevicesAllowed] => Array 
        (
         [GroupDevicesId] => Array 
          (
           [0] => 2 
          ) 

         [DevicesOnGroup] => Array 
          (
           [0] => 22,24,16 
          ) 

        ) 

      ) 

     [1] => Array 
      (
       [GroupUsersId] => 5 
       [GroupUsersName] => YYYY 
       [idUserType] => 3 
       [NameTypeUser] => Guest 
       [DevicesAllowed] => Array 
        (
        ) 

      ) 

     [2] => Array 
      (
       [GroupUsersId] => 1 
       [GroupUsersName] => ZZZ 
       [idUserType] => 1 
       [NameTypeUser] => Admin 
       [DevicesAllowed] => Array 
        (
         [GroupDevicesId] => Array 
          (
           [0] => 2 
          ) 

         [DevicesOnGroup] => Array 
          (
           [0] => 1,5,13,12,17,21,22,24,16 
          ) 

        ) 

      ) 

    ) 

... more stuff ... 

Мне нужно выяснить, какого рода разрешений, если таковые имеются, делает парень, если пытается просматривать устройства с, скажем, DeviceId = 5 Если этот конкретный идентификатор не находится на каком-либо из массивов, пользователю даже не разрешено его видеть ...

Я уже пытался изменить код в этом вопросе How to search by key=>value in a multidimensional array in PHP, но, я думаю, что мне не хватает некоторых вид итерации по массивам.

Любая помощь?

Приветствия и спасибо заранее.

Edit: $ _SESSION может быть изменен, если это необходимо ...

ответ

1

(Дополнение за комментарий ниже) я мог бы быть полностью отсутствует вашу точку зрения, но бы не только итерационный обработку вашего массива помощи?

$user_groups = array(
    0 => array(
    'GroupUsersName' => 'XXX', 
    'NameTypeUser' => 'Admin', 
    'idUserType' => 3, 
    'DevicesAllowed' => array(
     'DevicesOnGroup' => array(
     1, 2, 3 
    ) 
    ) 
), 
    1 => array(
    'GroupUsersName' => 'YYY', 
    'NameTypeUser' => 'ReadOnly', 
    'idUserType' => 1, 
    'DevicesAllowed' => array(
     'DevicesOnGroup' => array(
     3, 4, 5 
    ) 
    ) 
) 
); 

$device = 3; 
$right = 0; 
foreach ($user_groups as $group) { 
    if (array_key_exists('DevicesOnGroup', $group['DevicesAllowed'])) { 
    if (in_array($device, $group['DevicesAllowed']['DevicesOnGroup'])) { 
     if ($group['idUserType'] > $right) { 
     $right = $group['idUserType']; 
     } 
    } 
    } 
} 

print_r($right); 

Выходы:

3 

Если бы попросить устройства, которое не в группе, он не будет возвращать 0 (т.е. нет доступа).

+0

Вы не хватает точки на всем другом ... это почти то, что я хочу достичь. Но мне не нужен массив для переменной $ rights. Поскольку некоторые группы устройств могут перекрываться, и пользователь может иметь доступ к одному и тому же устройству 2 или 3 раза (вы делаете это в своем примере) ... теперь мне просто нужно проверить, что является самым низким «idUserType» (1 = Admin; 2 = Менеджер; 3 = Гость; Не установлен = даже не может видеть, что устройство существует ...), чтобы дать разрешения соответствующим образом. Не знаю, если я сделаю себе ясно ... –

+0

Привет. Отлично. Я редактировал код выше, чтобы (надеюсь) дать вам то, что вы хотите. – jhutar

+0

Yup! Я работал над вашим кодом и получил то же самое. Это точно! Благодарю. –

1

перебирать массив как этот

$guysDeviceId ; 
$bGuyMayPass = false; 
foreach($_SESSION["user_group"] as $userGroup){ 
    if(!isset($userGroup[DevicesAllowed]) || !isset($userGroup[DevicesAllowed][DevicesOnGroup])){ 
    continue; 
    } 
    if(in_array($userGroup[DevicesAllowed][DevicesOnGroup], $guysDeviceId){ 
    $bGuyMayPass= true; 
    } 
} 

if($bGuyMayPass){ 
//login, whatever 
} 
Смежные вопросы