PHP:将字符串转换为嵌套数组
我正在使用PHP:将字符串转换为嵌套数组,php,arrays,loops,laravel,Php,Arrays,Loops,Laravel,我正在使用Laravel并试图编写一个artisan命令,该命令接受参数$content,然后需要将该参数转换为数组。例如: // An example of a value that is being passed in from the CLI and stored as $content $content = "['div']['div'][0]['h2']['a']"; 为了澄清这一点,$content随后作为函数参数传入,用于从实际结果集中提取值。换句话说,我正在接收
Laravel
并试图编写一个artisan命令,该命令接受参数$content,然后需要将该参数转换为数组。例如:
// An example of a value that is being passed in from the CLI and stored as $content
$content = "['div']['div'][0]['h2']['a']";
为了澄清这一点,$content
随后作为函数参数传入,用于从实际结果集中提取值。换句话说,我正在接收来自API的响应,$content
是我需要从响应中提取的值的路径。例如,实现的硬编码版本如下所示:
$result = $report['div']['div'][0]['h2']['a'];
现在,$result
包含我需要处理的值。但是,我正在尝试使其动态化,这样我就不会在每次添加新数据源以检查报告时重复自己的操作。目前,我有4个函数,每个函数都有硬编码的路径以达到预期的结果;这样做的目的是,我可以传入一个包含所需值路径的参数,并重构我的代码,这样我就只有一个函数可以接受值路径作为参数
我希望这澄清了最终目标,以及为什么我只引用键,而不是值
无论如何,回到手头的问题上来。我尝试了以下不同的变体:
// Attempting to parse the string into an array
$arr = explode("]", trim(str_replace("[","",$content), "]"));
$array = ['div']['div'][0]['h2']['a']
这将产生以下数组:
array (size=5)
0 => string ''div'' (length=5)
1 => string ''div'' (length=5)
2 => string '0' (length=1)
3 => string ''h2'' (length=4)
4 => string ''a'' (length=3)
但是,我需要的是数组的格式如下所示:
// Attempting to parse the string into an array
$arr = explode("]", trim(str_replace("[","",$content), "]"));
$array = ['div']['div'][0]['h2']['a']
我尝试在$arr
上执行foreach($array as$element)
,并对每个元素执行数组推送
,但结果与$arr
相同
如何循环字符串并将其解析为数组?此外,我需要0保留为索引,而不是作为字符串进行类型转换。最后一点注意,$content
的值每次都会完全不同,所以我需要它非常灵活。唯一保持不变的部分是[
和]
将始终封装键
我很想听听其他人是如何解决这个看似微不足道的问题的(我从编程中休息了几年,显然忘记了比我想承认的更多的事情)。我真的以为str_替换和爆炸会给我带来我期待的结果
但是,在重新读取php.net/explode文档之后,它总是将每个元素转换为字符串(从而覆盖我的0索引),我不知道如何将其转换为嵌套数组,而不是简单的平面数组
我期待着您的建议和见解。谢谢
编辑:
包括使用参数来帮助提供更清晰信息的函数
private function yql_check_website($url, $xpath, $content) {
require_once('../vendor/OAuth.php');
$statement = "select * from html where url='{$url}' and xpath='{$xpath}' ";
$cc_key = $this->key;
$cc_secret = $this->secret;
$url = "http://query.yahooapis.com/v1/public/yql";
$args = array();
$args["q"] = $statement;
$args["format"] = "json";
$consumer = new OAuthConsumer($cc_key, $cc_secret);
$request = OAuthRequest::from_consumer_and_token($consumer, NULL,"GET", $url, $args);
$request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $consumer, NULL);
$url = sprintf("%s?%s", $url, OAuthUtil::build_http_query($args));
$url .= "&env=store://datatables.org/alltableswithkeys";
$ch = curl_init();
$headers = array($request->to_header());
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$rsp = curl_exec($ch);
$report = json_decode($rsp, true);
// Dynamically inspect the $report object for the xpath content
$result = $report . $content;
unset($report);
return $result;
}
因此,$report包含整个API响应,但我需要的唯一内容是$report['div']['div'][0]['h2']['a']
中提供的内容(至少在本例中,我正在抓取的每个报告的路径都不同)。因此,我尝试将命令行参数转换为数组的原因是,它可以在上面调用$content
的代码中使用,以便导航API的响应并从该段返回值
我希望这更有意义。而且,如果有更好的方法来实现这一最终目标,请随意提及。我可能采取了错误的方法…您可以在这里使用preg\u match\u all
$content = "['div']['div'][0]['h2']['a']";
$expression = /\['([a-zA-Z0-9]+)\']/;
$results = preg_match_all( $expression, $content, $matches );
print_r( $matches );
如果你必须让数组像你所说的那样,你可以这样做(对于初学者来说,这是一个有点丑陋,虽然它是…)
注意:以上所有内容均未经测试…这是您想要的吗
$str = "['div']['div'][0]['h2']['a']";
$str = preg_split('/]\[/', substr(str_replace("'", "", $str), 1, -1));
print_r($str);
Array (
[0] => div
[1] => div
[2] => 0
[3] => h2
[4] => a
)
Laravel有几种阵列访问方法,可以提供对阵列的“点”访问,包括。方法原型如下所示:
function array_get(array $array, string $key, mixed $default = null)
因此,在你的情况下,你可以写:
$results = array_get($report, "div.div.0.h2.a");
$array=['div']['div'][0]['h2']['a']
毫无意义。你有一堆键,但没有值。你想让你的$array像:$array[0]=['div']、$array[1]=['div']、$array[2]=['0']…
?@meager,我已经更新了这个问题,以澄清为什么我只引用键。@drobddy,我不明白,你的字符串是什么样子?@Akshat,不太清楚。它实际上是一个API响应的路径,因此我需要将其格式化为['div']['div'][0]['h2']['a']
,以便访问['a']
的值。我会尝试一下,让您知道它是如何工作的。谢谢你,乔纳森。结果是返回了Array([0]=>Array([0]=>div'][1]=>div'][2]=>a'])[1]=>Array([0]=>div[1]=>div[2]=>a))
,但我想你已经了解了一些事情。我将使用preg\u match\u all
,看看是否可以调整表达式,以提供我想要的结果。谢谢你给我指明了一个坚实的方向。如果我能让它工作,我很乐意接受这个答案。酷。请务必查看我编辑的答案。。。创建了一个递归函数来构建它。它还没有经过测试(我在编辑器中构建了它,一年多来还没有真正编写PHP代码,呵呵)很有趣。。。你说得对,这有点难看,但似乎有道理。我要试一试,看看我能做些什么。再次感谢。这非常接近,但我需要它是多维的,这样它就像数组('div'=>array('div'=>array(“0”=>array(“h2”=>array(“a”)))。但是,这让我知道了如何处理事情。