我有一个输入:
<input name="subscription[login]" />
我正在创建一个带数组的函数(示例为$_POST
)和html名称(subscription[login]
)。
它应该返回$_POST['subscripton']['login']
所以我做了:
public static function &getSubArrayRefFromPath($arr, $arrPath) {
if(!is_array($arrPath)) {
throw new Exception('$arrPath is not an array');
}
else {
$el = $arr;
foreach($arrPath as $k) {
$el &= $el[$k];
}
return $el;
}
}
public static function &getSubArrayRefFromHtmlPath($arr, $htmlPath) {
$regex = '#^([a-z]+)(?:\[([a-z]+)\]){2}(\[\])?$#i';
preg_match($regex, $htmlPath, $rawKeys);
}
但我无法使用正则表达式检索所有值:
我在rawKeys中得到这个:
array
0 => string 'abc[def][ghi]' (length=13)
1 => string 'abc' (length=3)
2 => string 'ghi' (length=3)
我可能错过了一些东西......
答案 0 :(得分:0)
锂框架有一个非常方便的结构叫做Set:
include 'Set.php'
$ary = array('a' => array('b' => 1, 'c' => 2), 'd' => 3);
lithium\util\Set::extract($ary, '/a/b')
-> array(1)
lithium\util\Set::extract($ary, '/a/.');
-> array(array('b' => 1, 'c' => 2))
lithium\util\Set::extract($ary, '/a/@*');
-> array(array('b', 'c'))
修改强>
对于不那么强大的东西:
function find(&$ary, $key) {
if (strstr($key, '.')) {
list($k, $key) = explode('.', $key, 2);
return find($ary[$k], $key);
} else {
return $ary[$key];
}
}
find($ary, 'a');
-> array('b' => 1, 'c' => 2)
find($ary, 'a.b');
-> 1
我想你可以弄清楚如何自己将a[b]
转换为a.b
(提示:它在评论中)
答案 1 :(得分:0)
工作正则表达式:
'#^([a-z]+)(?:\[([a-z]+)\])(?:\[([a-z]+)\])$#i'
结果def
被ghi
覆盖(在您的示例abc[def][ghi]
中),这就是为什么您最终只得到两个结果。
要删除第一个元素(始终是与完整模式匹配的文本),请使用:
unset($rawKeys[0]);