如何将数组键提取到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我很难解释我自己。我在评论中的意思是,我的答案允许您更改分隔符(在函数内部),而您的第一个版本没有,因此海报对您的答案进行了评论。但后来我看到你的第一个版本也允许更改分隔符,所以我删除了我的评论。