I’ve realized I need to stop banging my head and ask for help…
I have the following array:
$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.' ) ) ));
I’m trying to collapse / cascade the keys into a one-dimension array like so:
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' )
I could use nested loops, but the array will be an undefined number of dimensions.
This is the closest I’ve gotten:
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; }
Any ideas?
Advertisement
Answer
I think this should do it:
public function iterateKeys(array $array, $joiner, $prepend = NULL) { if (!isset($formattedArray)) { $formattedArray = array(); } foreach ($array as $key => $value) { if(is_array($value)) { $formattedArray = array_merge($formattedArray, $this->iterateKeys($value, $joiner, $prepend . $joiner . $key)); } else { $formattedArray[] = $prepend . $joiner . $key; } } return $formattedArray; }
Since the recursive call returns an array, you need to use array_merge
to combine it with what you currently have. And for the non-array case, you need to push the new string onto the array, not replace the array with a string.