如何将数组键提取到PHP数组中的字符串

如何将数组键提取到PHP数组中的字符串,php,arrays,Php,Arrays,我需要将关联数组键提取到字符串中,并使用“/”或任何字符/符号内爆 例如: $array = array([key1] => array([key11] => array([key111] => 'value111', [key112] => 'value112', [key113]

我需要将关联数组键提取到字符串中,并使用“/”或任何字符/符号内爆

例如:

$array = array([key1] => 
                array([key11] => 
                     array([key111] => 'value111', 
                           [key112] => 'value112', 
                           [key113] => 'value113',
                          ),
                 ),
           );
我需要一个如下数组的输出:

array([0] => 'key1/key11/key111',[1] => 'key1/key11/key112', [2] => 'key1/key11/key112');

你可以做一些像

    $mapArray = array();
    $symbol = '/';
    foreach($array as $k =>$v)
        foreach($v as $k1 =>$v1)
            foreach($v1 as $k2 =>$v2)
                $mapArray[] = $k.$symbol.$k1.$symbol.$k2; 

而且,这显然只适用于这种特殊情况,如果需要更通用的话,也可以这样做,但我认为这应该让您开始学习。

适用于不同深度的阵列:

function getKeys($array, $prefix='', $separator = '/') {
  $return = array();
  foreach($array as $key => $value) {
    if (!is_array($value)) $return[] = $prefix . $key;
    else $return = array_merge($return, getKeys($value, $prefix . $key . separator), $separator);
  }
  return $return;
}

$keys = getKeys($array, '', '#');

参见在线小提琴

我编辑了给出的答案,并得出了以下代码

function listArrayRecursive($someArray, &$outputArray, $separator = "/") {
    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($someArray), RecursiveIteratorIterator::SELF_FIRST);
    foreach ($iterator as $k => $v) {

        if (!$iterator->hasChildren()) {
            for ($p = array(), $i = 0, $z = $iterator->getDepth(); $i <= $z; $i++) {
                $p[] = $iterator->getSubIterator($i)->key();
            }
            $path = implode($separator, $p);
            $outputArray[] = $path;
        }
    }
}

$outputArray = array();
listArrayRecursive($array, $outputArray);
print_r($outputArray);
输出:

Array
(
    [key1] => Array
        (
            [key11] => Array
                (
                    [key111] => value111
                    [key112] => value113
                    [key113] => value113
                )
        )
)
Array
(
    [0] => key1/key11/key111
    [1] => key1/key11/key112
    [2] => key1/key11/key113
)

它可以工作,但我如何使用函数param将“/”更改为动态方式。请参见我的编辑(fiddle也已修改),但这应该是一个简单的问题,如果您阅读手册,并且为什么接受其他答案,您似乎比我更不理解,也没有选择指定分隔符!?为什么删除了你关于
内爆
行的评论?我从来没有抱怨过这一行,并投了反对票!?奇怪的讨论。我删除了评论,因为我看到你的第一个版本与我的代码相同,所以你是对的。谁说我否决了你?嗯?我的第一个版本?我的答案的第一个版本和你的一样?我比你的回答早了12分钟。我听不懂你的第一句话,因为你的评论是
我的答案是$path=infrade(“/”,$p);它定义了运算符
,这与我的第一个版本有什么关系?两种方式我都不介意。讨论结束了。@rabude我很难解释我自己。我在评论中的意思是,我的答案允许您更改分隔符(在函数内部),而您的第一个版本没有,因此海报对您的答案进行了评论。但后来我看到你的第一个版本也允许更改分隔符,所以我删除了我的评论。