Php 将字符串转换为数组的最佳方法
我有一个数组Php 将字符串转换为数组的最佳方法,php,regex,Php,Regex,我有一个数组$AR 我有一个字符串“set[0][p1]” 当给定此字符串时,我需要访问位于$AR['set'][0]['p1'] 我完全可以控制这个字符串,所以我不需要担心注入和其他事情,我可以确定它的格式会很好。我无法将p1放入“待设置”“设置[0]['p1']”中。检查: 哦,您想访问数组的索引。。。以下是我的看法: getValue($AR, array('set', 0, 'p1')); 或者如果确实必须使用原始字符串表示形式: parse_str('set[0][p1]', $k
$AR
我有一个字符串
“set[0][p1]”
当给定此字符串时,我需要访问位于$AR['set'][0]['p1']
我完全可以控制这个字符串,所以我不需要担心注入和其他事情,我可以确定它的格式会很好。我无法将p1放入“待设置”“设置[0]['p1']”中。
检查:
哦,您想访问数组的索引。。。以下是我的看法:
getValue($AR, array('set', 0, 'p1'));
或者如果确实必须使用原始字符串表示形式:
parse_str('set[0][p1]', $keys);
getValue($AR, $keys);
免责声明:我尚未对此进行测试,您可能需要在某处使用array\u keys()
和助手函数:
function getValue($array, $key, $default = false)
{
if (is_array($array) === true)
{
settype($key, 'array');
foreach ($key as $value)
{
if (array_key_exists($value, $array) === false)
{
return $default;
}
$array = $array[$value];
}
return $array;
}
return $default;
}
我会避免你陷入这个问题。你需要类似的东西。我对“[”和“]”括号不是百分之百的关心,因为我以前从未在它们上运行过正则表达式。。。如果是错的,有人能纠正我吗
foreach(preg_split('/[\[\]]/', "set[0][p1]") as $aValue) {
$AR[$aValue[0]][$aValue[1]][$aValue[2]] = '?';
}
My try,它应该能够处理字符串中任意数量的
[]
s:
要拆分字符串,可以使用
(更多)完整代码:
我将错误处理留给您;) 也许这很疯狂,但你考虑过摘录吗?它可能不是最快的解决方案,但它的新颖之处在于需要最少的代码
extract( $AR );
$target = eval("\$set[0]['p1']");
主要的区别(就输入而言)是需要将“$”预先挂起到字符串,并确保括号内有引号
主要的好处是,您正在尝试完成的任务变得非常明显,并且您正在使用两个本机PHP函数。这两种情况都意味着,对于那些不熟悉您的系统的人来说,解决方案将更具“可读性”
哦,您只使用了两行代码。您是否“控制”了该字符串?也就是说,它是否保证“格式良好”且不包含任何恶意代码?这个问题实际上是一个相当有趣的问题,我完全打算把它偷走,使之成为一个“面试问题”。@Felix:是的,我刚刚意识到这一点。对不起=在当前版本中,“神奇的部分”是从“set[0][p1]”到数组(set,0,p1),如果op想要坚持原来的计划;)
parseString
将为您提供数组([set]=>Array([0]=>Array([p1]=>))
,而不是平面数组。我想说最简单的方法是使用preg_split
(就像在我的回答中一样),你的正则表达式会给出这样的结果:Array([0]=>set,[1]=>0,[2]=>,[3]=>p1,[4]=>)
$parts = preg_split('%\[?(\w+)\]?%', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
function get_value($string, $array) {
$parts = preg_split('%\[?(\w+)\]?%', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
foreach($parts as $part) {
$array = $array[$part];
}
return $array;
}
$array = array('set'=>array(array('p1'=>'foo')));
$string = "set[0][p1]";
echo get_value($string, $array); // echoes 'foo'
extract( $AR );
$target = eval("\$set[0]['p1']");