如何在PHP数组中将数组键提取为字符串

4
我需要将关联数组的键提取到一个字符串中,并使用“/”或任何字符/符号进行连接。
例如:
$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');
3个回答

2

我编辑了一个在这里给出的答案,并编写了以下代码。

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
)

为什么删除了你与 implode 行相关的评论,而我从未抱怨过,并因此给了我一个踩的反对?这里的讨论方式有点奇怪。 - rabudde
我已经删除了评论,因为我看到你的第一个版本与我的代码相同,所以你是正确的。谁说我给你点了踩? - Itay
什么?我的第一个版本?我的答案的第一个版本和你的一样吗?我在你之前只有12分钟回答了这个问题。而且我不明白你的第一句话,因为你的评论是“我的答案有这一行 $path = implode('/', $p); 它定义了运算符”,这和我的第一个版本有什么关系?无论如何,我都无所谓。讨论结束。 - rabudde
@rabude,我很难解释清楚自己的意思。我的评论是指我的答案让你可以在函数内更改分隔符,而你的第一个版本则不行,因此发布者对你的答案发表了评论。但后来我发现你的第一个版本也允许更改分隔符,所以我删除了我的评论。 - Itay

1

适用于不同深度的数组:

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, '', '#');

查看在线小提琴 http://ideone.com/krU4Xn


它能正常工作,但我如何以动态方式将“/”更改为使用函数参数的方式? - Pradeep shyam
请查看我的编辑(fiddle也已修改),但如果您阅读http://www.php.net/manual/zh/language.functions.php上的手册,这应该很容易。 - rabudde
为什么您接受了另一个答案,它似乎对您来说比我的更难以理解,并且也没有指定分隔符的选项? - rabudde

0

你可以这样做...

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

同时,这显然只适用于特定情况,如果需要更通用的解决方案,也是可以实现的,但我认为这应该能让你开始了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接