【问题标题】:Get php sub array from html input name从 html 输入名称获取 php 子数组
【发布时间】:2012-01-13 11:46:39
【问题描述】:

我有一个输入:

<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)

我可能错过了什么..

【问题讨论】:

    标签: php html regex


    【解决方案1】:

    工作正则表达式:

    '#^([a-z]+)(?:\[([a-z]+)\])(?:\[([a-z]+)\])$#i'
    

    结果defghi 覆盖(在您的示例中为abc[def][ghi]),这就是您最终只得到两个结果的原因。

    要删除第一个元素(始终是与完整模式匹配的文本),请使用:

    unset($rawKeys[0]);
    

    【讨论】:

    • ok 是不是有可能检索到这两个元素?
    【解决方案2】:

    锂框架有一个非常方便的结构,称为集合:

    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(提示:它在 cmets 中)

    【讨论】:

    • 好的,但这不是答案,我不想使用锂来对字符串进行简单的操作
    • 你可以只获取那个文件,或者只获取函数,不需要厨房水槽的其余部分。
    • 好的,但是对数组的基本操作,我在getSubArrayRefFromPath 中完成了。我需要的是从字符串 "abc[def][ghi]" 中获取像 array('abc', 'def', 'ghi') 这样的数组。
    • explode('.', preg_replace(array('/(\[|\]\[)/', '/\]/'), array('.', ''), $key));
    • 应该可以解决问题,但没有更简单的方法使用 preg_replace(_all) 直接检索键名吗?
    猜你喜欢
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2015-06-04
    • 2021-10-15
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多