PHP-串联/级联多维数组键
我意识到我需要停止敲打我的头并寻求帮助 我有以下数组:PHP-串联/级联多维数组键,php,arrays,multidimensional-array,dynamic-arrays,Php,Arrays,Multidimensional Array,Dynamic Arrays,我意识到我需要停止敲打我的头并寻求帮助 我有以下数组: $permissionTypes = array( 'system' => array( 'view' => 'View system settings.', 'manage' => 'Manage system settings.' ), 'users' => array( 'all' =>
$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;
}
有什么想法吗?我想这应该可以:
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);
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\u 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));
使用递归处理任意级别的嵌套。@rpaskett:我对简单地展平数组不感兴趣。我想将子数组键连接到父数组键上。请看一看这个例子。@Barmar:这就是我正在尝试的。我已经添加了示例代码。你知道我哪里出错了吗?@Barmar:谢谢!我不熟悉数组合并。工作完美。输入错误仅供参考:$formatted_数组应该是$formattedArray.FYI,我在返回之前添加了以下内容,以消除最终数组上的前缀:if为空$prepend{foreach$formattedArray as$key=>$value{if!strpos$value,$joiner==false{$formattedArray[$key]=substr$value,1;}}