Intereting Posts
Как программировать логин / аутентификацию пользователя? Как установить карту изображения в части фонового изображения? Что ограничивает мои ресурсы PHP? Отправка формы через Javascript, форма, определенная во внешнем файле PHP Добавить … если строка слишком длинная PHP Facebook php app продолжает цикл в IE, есть ли исправление на стороне сервера? Зачем использовать функцию sprintf в PHP? Невозможно вставить путь для нескольких изображений в таблице базы данных с помощью codeigniter Как вы вставляете несколько записей в таблицу одновременно? Bamboo CI Server – как настроить тестирование PHPUnit PHP: подготовленный оператор, требуется инструкция IF Zend Framework, что $ this -> _ forward делает Выполнение множественного соединения с выражениями в Zend Framework 2 Почему спецификация ISO-8601 выглядит повсеместно игнорируемой, когда речь идет о десятичных знаках? PHP Comet. Как это сделать лучше?

PHP – ключи многоадресного массива Concatenate / cascade

Я понял, что мне нужно перестать ударить головой и попросить о помощи …

У меня есть следующий массив:

$permissionTypes = array( 'system' => array( 'view' => 'View system settings.', 'manage' => 'Manage system settings.' ), 'users' => array( 'all' => array( 'view' => 'View all users.', 'manage' => 'Manage all users.' ) ), 'associations' => array( 'generalInformation' => array( 'all' => array( 'view' => 'View general information of all associations.', 'manage' => 'Manage general information of all associations.' ), 'own' => array( 'view' => 'View general information of the association the user is a member of.', 'manage' => 'Manage general information of the association the user is a member of.' ) ) )); 

Я пытаюсь свернуть / каскадировать ключи в одномерный массив следующим образом:

 array( 'system_view', 'system_manage', 'users_all_view', 'users_all_manage', 'associations_generalInformation_all_view', 'associations_generalInformation_all_manage', 'associations_generalInformation_own_view', 'associations_generalInformation_own_manage' ) 

Я мог бы использовать вложенные циклы, но массив будет неопределенным числом измерений.

Это самое близкое, что я получил:

 public function iterateKeys(array $array, $joiner, $prepend = NULL) { if (!isset($formattedArray)) { $formattedArray = array(); } foreach ($array as $key => $value) { if(is_array($value)) { array_push($formattedArray, $joiner . $this->iterateKeys($value, $joiner, $key)); } else { $formattedArray = $prepend . $joiner . $key; } } return $formattedArray; } 

Есть идеи?

Я думаю, это должно сделать это:

 public function iterateKeys(array $array, $joiner, $prepend = NULL) { if (!isset($formattedArray)) { $formattedArray = array(); } foreach ($array as $key => $value) { if(is_array($value)) { $formatted_array = array_merge($formattedArray, $this->iterateKeys($value, $joiner, $prepend . $joiner . $key)); } else { $formattedArray[] = $prepend . $joiner . $key; } } return $formattedArray; } 

Поскольку рекурсивный вызов возвращает массив, вам необходимо использовать array_merge чтобы объединить его с тем, что у вас есть. А для случая без массива вам нужно нажать новую строку на массив, а не заменить массив на строку.

попробуй это:

 function flattern(&$inputArray, $tmp = null, $name = '') { if ($tmp === null) { $tmp = $inputArray; } foreach($tmp as $index => $value) { if (is_array($value)) { flattern($inputArray, $value, $name.'_'.$index); if (isset($inputArray[$index])) { unset($inputArray[$index]); } } else { $inputArray[$name.'_'.$index] = $value; } } return $inputArray; } var_dump(flattern($permissionTypes)); с function flattern(&$inputArray, $tmp = null, $name = '') { if ($tmp === null) { $tmp = $inputArray; } foreach($tmp as $index => $value) { if (is_array($value)) { flattern($inputArray, $value, $name.'_'.$index); if (isset($inputArray[$index])) { unset($inputArray[$index]); } } else { $inputArray[$name.'_'.$index] = $value; } } return $inputArray; } var_dump(flattern($permissionTypes)); 
 function flattenWithKeys(array $array, array $path = []) { $result = []; foreach ($array as $key => $value) { $currentPath = array_merge($path, [$key]); if (is_array($value)) { $result = array_merge($result, flattenWithKeys($value, $currentPath)); } else { $result[join('_', $currentPath)] = $value; } } return $result; } $flattened = flattenWithKeys($permissionTypes);