Я понял, что мне нужно перестать ударить головой и попросить о помощи …
У меня есть следующий массив:
$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);