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

如何在PHP中从字符串中获取数组值?,php,arrays,Php,Arrays,我有一个sting,在这个字符串中,我的数组值被存储。如何从字符串中获取数组值?PHP中是否有任何预定义的函数或将使用REGEX实现的函数 $rule ="array( array('parameter'=> 'signature name', 'values'=>'RNSOC023', 'condition'=>'EQUALS', 'rule type'=>'AND'), array('parameter'=> 'DestinationZone', 'values

我有一个sting,在这个字符串中,我的数组值被存储。如何从字符串中获取数组值?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')
)";
如果我打印了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 ) )

代码将在调用eval()的代码范围内执行。因此,eval()调用中定义或更改的任何变量在终止后都将保持可见。更多信息


代码将在调用eval()的代码范围内执行。因此,eval()调用中定义或更改的任何变量在终止后都将保持可见。更多信息


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

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

终于找到了解决方案,请尝试以下方法:

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

终于找到了解决方案,请尝试以下方法:

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

因此,基本上您希望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'];
上述方法有效,并在我的环境中进行了测试

有关和的详细信息

如果运行
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 ) ) 

因此,基本上您希望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'];
上述方法有效,并在我的环境中进行了测试

有关和的详细信息

如果运行
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 ) ) 
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' )
)
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' )
)


你可以使用邪恶的
eval
。但在进入这个方向之前:字符串从何而来?这是由机器定义的规则,并作为字符串存储在数据库中,那么您必须对其求值。但我建议你一定要改变它的储存方式。将其存储为JSON或序列化,因为可以很容易地将其水合为原始类型(即数组)“
from$rule value。如果数据库中存储的值不再改变,我建议运行一次“转换”脚本,将可用值转换到数据库中。如果该“机器”不断更新/添加到数据库,并且您无法更改,则-eval是剩余的选择。也许可以考虑起诉制造这台机器的“开发人员”…你可以使用邪恶的
eval
。但在进入这个方向之前:字符串从何而来?这是由机器定义的规则,并作为字符串存储在数据库中,那么您必须对其求值。但我建议你一定要改变它的储存方式。将其存储为JSON或序列化,因为可以很容易地将其水合为原始类型(即数组)“
from$rule value。如果数据库中存储的值不再改变,我建议运行一次“转换”脚本,将可用值转换到数据库中。如果该“机器”不断更新/添加到数据库,并且您无法更改,则-eval是剩余的选择。也许可以考虑起诉制造这台机器的“开发者”…同意,但在我的情况下,我不得不这样做为什么?您要保存阵列的位置在哪里?或者它从一开始就存在?同意,但在我的场景中,我不得不这样做为什么?您要保存阵列的位置在哪里?还是从一开始就存在?你试过吗??结果在
array(1){[0]=>string(324)”array(array('parameter'=>…
再次保留内容获取字符串仅在您尝试过它之后??结果在
array(1){[0]=>string(324)”array(array)中('parameter'=>…
再次保留仅获取字符串的内容您必须获取字符串。您删除了引号您必须获取字符串。您删除了引号Hanks dude,刚刚学会了以字符串格式保存数组的新方法感谢dude,刚刚学会了以字符串格式保存数组的新方法