Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:将字符串转换为嵌套数组_Php_Arrays_Loops_Laravel - Fatal编程技术网

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”)))。但是,这让我知道了如何处理事情。