如何从PHP中的字符串中获取数组值?

时间:2018-03-29 11:15:18

标签: php arrays

我有一个刺痛,在该字符串中,我的数组值被存储。如何从字符串中获取数组值?在PHP中是否有任何预定义的功能或将使用REGEX实现?

$rule ="array(
array('parameter'=> 'signature name', 'values'=>'RNSOC023', 'condition'=>'EQUALS', 'rule type'=>'AND'),
array('parameter'=> 'DestinationZone', 'values'=>'l3-internet', 'condition'=>'EQUALS', 'rule type'=>'AND'),
array('parameter'=> 'Application', 'values'=>'ftp,sftp', 'condition'=>'EQUALS', 'rule type'=>'AND')
)";

如果我做print_r($ rule);它只给出与上面相同的字符串值。但我希望输出像

Array ( [0] => Array ( [parameter] => signature name [values] => RNSOC023 [condition] => EQUALS [rule type] => AND ) [1] => Array ( [parameter] => DestinationZone [values] => l3-internet [condition] => EQUALS [rule type] => AND ) [2] => Array ( [parameter] => Application [values] => ftp,sftp [condition] => EQUALS [rule type] => AND ) )

5 个答案:

答案 0 :(得分:3)

终于得到了解决方案,试试这个:

$rule ="array(
    array('parameter'=> 'signature name', 'values'=>'RNSOC023', 'condition'=>'EQUALS', 'rule type'=>'AND'),
    array('parameter'=> 'DestinationZone', 'values'=>'l3-internet', 'condition'=>'EQUALS', 'rule type'=>'AND'),
    array('parameter'=> 'Application', 'values'=>'ftp,sftp', 'condition'=>'EQUALS', 'rule type'=>'AND')
    )";
    $returnValue = '';
    eval("\$returnValue = $rule;");
    print_r($returnValue);

答案 1 :(得分:3)

eval()是邪恶的!它使您的代码可以解决各种安全问题,应该不惜一切代价避免使用。试试这个:

$rule ="array(
array('parameter'=> 'signature name', 'values'=>'RNSOC023', 'condition'=>'EQUALS', 'rule type'=>'AND'),
array('parameter'=> 'DestinationZone', 'values'=>'l3-internet', 'condition'=>'EQUALS', 'rule type'=>'AND'),
array('parameter'=> 'Application', 'values'=>'ftp,sftp', 'condition'=>'EQUALS', 'rule type'=>'AND')
)";
preg_match_all("/(?:array\()('.*?'\s*=>\s*'.*?'\s*)+(?:\))/", $rule, $matches);
$rulearray = array();
$i = 0;
foreach ($matches[1] as $value) {
    preg_match_all("/('.*?'\s*=>\s*'.*?')/", $value, $m);
    foreach ($m[1] as $e) {
        list ($k, $v) = preg_split('/\s*=>\s*/', $e);
        $rulearray[$i][$k] = $v;
    }
    $i++;
}
print_r($rulearray);

输出:

Array ( [0] => Array ( ['parameter'] => 'signature name'
                       ['values'] => 'RNSOC023'
                       ['condition'] => 'EQUALS'
                       ['rule type'] => 'AND' ) 
        [1] => Array ( ['parameter'] => 'DestinationZone' 
                       ['values'] => 'l3-internet' 
                       ['condition'] => 'EQUALS'
                       ['rule type'] => 'AND' ) 
        [2] => Array ( ['parameter'] => 'Application'
                       ['values'] => 'ftp,sftp'
                       ['condition'] => 'EQUALS'
                       ['rule type'] => 'AND' )
)

答案 2 :(得分:0)

代码将在调用eval()的代码范围内执行。因此,在eval()调用中定义或更改的任何变量在终止后仍然可见。详情HERE

eval("\$rule = $rule;");
print_r($rule);

答案 3 :(得分:0)

用于将数据数组保存在数据库中的方法是错误的,您应该在数据库中使用json字符串格式,并且在获取数据时,您可以在php中将json_decode函数转换为数组。尝试将该数组转换为json字符串并存储在db中。这是最好的做法。这就是为什么你会遇到这些类型的问题。

答案 4 :(得分:0)

所以基本上你需要json_encode()来制作数组。 我现在测试的是以下内容:

$rule = array(array('parameter1'=> 'signature name', 'values'=>'RNSOC023', 'condition'=>'EQUALS', 'rule type'=>'AND'), 1 => array('parameter2'=> 'DestinationZone', 'values'=>'l3-internet', 'condition'=>'EQUALS', 'rule type'=>'AND'), 2 => array('parameter'=> 'Application', 'values'=>'ftp,sftp', 'condition'=>'EQUALS', 'rule type'=>'AND'));
$jr = json_encode($rule);
$jd = json_decode($jr, true);
print $jd[0]['values'];

以上工作,并在我的环境中进行了测试。

有关json_encode();json_decode();

的详细信息

如果您运行print_r($jd);,您将获得以下输出:

Array ( [0] => Array ( [parameter1] => signature name [values] => RNSOC023 [condition] => EQUALS [rule type] => AND ) [1] => Array ( [parameter2] => DestinationZone [values] => l3-internet [condition] => EQUALS [rule type] => AND ) [2] => Array ( [parameter] => Application [values] => ftp,sftp [condition] => EQUALS [rule type] => AND ) )