【问题标题】:PHP - Concatenate / cascade multidimensional array keysPHP - 连接/级联多维数组键
【发布时间】:2015-01-03 03:10:43
【问题描述】:

我意识到我需要停止敲打我的头并寻求帮助......

我有以下数组:

$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;
}

有什么想法吗?

【问题讨论】:

  • 使用递归来处理任意级别的嵌套。
  • @rpaskett:我对简单地展平阵列不感兴趣。我想将子数组键连接到父数组键上。请看示例。
  • @Barmar:这就是我正在尝试的。我已经添加了我的示例代码。你知道我哪里出错了吗?

标签: php arrays multidimensional-array dynamic-arrays


【解决方案1】:

我认为应该这样做:

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;
}

由于递归调用返回一个数组,您需要使用array_merge 将其与您当前拥有的内容结合起来。而对于非数组的情况,需要将新的字符串压入数组,而不是用字符串替换数组。

【讨论】:

  • @Barmar:谢谢!我不熟悉array_merge。完美运行。 (仅供参考:$formatted_array 应该是 $formattedArray。)
  • 仅供参考,我在返回之前添加了以下内容以消除最终数组的前置: if (is_null($prepend)) { foreach ($formattedArray as $key => $value) { if (!(strpos($value, $joiner) === false)) { $formattedArray[$key] = substr($value, 1); } } }
【解决方案2】:

试试这个:

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));

【讨论】:

    【解决方案3】:
    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);
    

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2013-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多