【发布时间】:2014-06-10 21:44:44
【问题描述】:
我有一个大数组的以下sn-p:
Array
(
[agreementTypes] => Array
(
[WS_PEAgreementType] => Array
(
[0] => Array
(
[description] => Blah blah blah
[type] => Contract Supply
)
[1] => Array
(
[description] => Standard
[type] => Standard
)
)
)
任何带有“WS_PE”的键都是多余的。有些与上述不同,在不同级别的数组中。我想找到任何包含“WS_PE”的键,获取它的值,并将它们直接分配给找到的“WS_PE”键的父级。
上面的sn-p必须是这样的:
Array
(
[agreementTypes] => Array
(
[0] => Array
(
[description] => Blah blah blah
[type] => Contract Supply
)
[1] => Array
(
[description] => Standard
[type] => Standard
)
)
在 for 循环中很容易找到密钥。但是我一直不知道找到的键的父级是(递归地)主数组的名称和级别。
编辑:这是我编写的递归函数。它的工作原理是跟踪父键的名称,而不是数组中的级别/位置:
class PISupport {
private $previousKey;
public function stripRedundantAspireTags($rawData) {
$returnArray = array();
foreach($rawData as $key => $data) {
if(false !== strpos($key, 'WS_PE')) {
// Want to remove this key and assign data to the previous key
$keyToUse = $this->previousKey;
} else {
// Just use the current key in the loop
$keyToUse = $key;
}
$this->previousKey = $key;
if(is_array($data)) {
$obj[$keyToUse] = $this->stripRedundantAspireTags($data); //RECURSION
} else {
$obj[$keyToUse] = $data;
}
}
return $returnArray;
}
}
更新
多亏了 didierc,几乎可以工作的例子。一个问题是它以某种方式丢弃了除数组第一级的第一个元素之外的所有元素。某处的逻辑错误:https://gist.github.com/anonymous/b2fe834209ad74502824
【问题讨论】:
-
你需要写一个递归函数。
-
WS_PE 键是否已修复?我的意思是他们总是在第二层,或者可能是嵌套的?如果它是嵌套的,你需要编写一个递归函数
-
请参阅stackoverflow.com/questions/20592046/… 作为起点。我现在没有时间写一个真正的答案。但是如果你自己弄清楚,你会学得更好,以此作为提示。
-
这是另一个适用的问题:stackoverflow.com/questions/21938442/…
-
键名中的
WS_PE在哪里?它总是在开始吗?如果不是,你怎么知道它应该分配到上数组中的哪个键?