我有以下数组:
Array
(
[0] => 32
[1] => Array
(
[uuid] => 92bbf05c-b49e-4950-9d4a-69c226325131
[conversation_uuid] => CON-ee2287cb-ddb7-47e3-9595-0b4d36ac57e3
[status] => failed
[direction] => outbound
)
)
希望得到身份和状态,我有以下代码:
<?php
require __DIR__ . '/../env.php';
//TransferLog Tropo
ini_set('display_errors', 1); ini_set('log_errors',1); error_reporting(E_ALL); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
header('Content-Type: application/json');
$body = file_get_contents('callnexmo.log');
//$body = json_decode($json, true);
//$id=$_GET['id'];
//$body=array($id, $json);
//$req_dump = print_r($body, true );
//$fp = file_put_contents('callnexmo.log', $req_dump);
$conn = new mysqli($servername, $username, $password, $database);
//foreach ($body as $value)
//{
$status=$body[1]['status'];
$to=$body[1]['to'];
$from=$body[1]['from'];
$id=$body[0];
echo " body = $body";
var_dump($body);
echo " status = $status";
var_dump($status);
echo " id = $id";
var_dump($id);
//rest of the code
但输出让我
Warning: Illegal string offset 'status' in /opt/lampp/htdocs/buttoncall/skeleton-application/ficheiros/records/teste.php on line 23
Warning: Illegal string offset 'to' in /opt/lampp/htdocs/buttoncall/skeleton-application/ficheiros/records/teste.php on line 24
Warning: Illegal string offset 'from' in /opt/lampp/htdocs/buttoncall/skeleton-application/ficheiros/records/teste.php on line 25
body = Array
(
[0] => 32
[1] => Array
(
[uuid] => 92bbf05c-b49e-4950-9d4a-69c226325131
[conversation_uuid] => CON-ee2287cb-ddb7-47e3-9595-0b4d36ac57e3
[status] => failed
[direction] => outbound
)
)
string(264) "Array
(
[0] => 32
[1] => Array
(
[uuid] => 92bbf05c-b49e-4950-9d4a-69c226325131
[conversation_uuid] => CON-ee2287cb-ddb7-47e3-9595-0b4d36ac57e3
[status] => failed
[direction] => outbound
)
)
"
status = rstring(1) "r"
id = Astring(1) "A"
我一直在做类似于这个的逻辑,它有工作,但现在我似乎可以把我的手指放在错误的.. 有人可以帮助我吗?
答案 0 :(得分:0)
$body
是字符串而不是数组,因为file_get_contents
返回的文件内容是字符串。因此,您无法像使用数组一样使用$body
。
您可以使用regexp解析字符串中的数据(请查看pre_match和preg_match_all函数)。
答案 1 :(得分:0)
实际上,你的第一个断言是错误的。你有一个字符串&#34;看起来&#34;像一个数组。
var_dump()
在输出开始时告诉您:string(264)
。
根据您的header()
声明,您似乎想要处理json字符串。
如果您可以控制callnexmo.log
的内容,我建议您将php数组数据存储为json字符串。所以它看起来像这样:
[32,{"uuid":"92bbf05c-b49e-4950-9d4a-69c226325131","conversation_uuid":"CON-ee2287cb-ddb7-47e3-9595-0b4d36ac57e3","status":"failed","direction":"outbound"}]
然后,当您想要处理.log文件中的数据时,您只需json_decode($string,true)
该字符串即可生成易于访问的数组。
如果您无法控制callnexmo.log
的内容并且阵列结构可靠,那么您可以做到最好尝试使用正则表达式解析它,但这可能是也可能不是可靠的努力。
根据您发布的数据,这是一个简单的演示:( Pattern Demo)(PHP Demo)
$body='Array
(
[0] => 32
[1] => Array
(
[uuid] => 92bbf05c-b49e-4950-9d4a-69c226325131
[conversation_uuid] => CON-ee2287cb-ddb7-47e3-9595-0b4d36ac57e3
[status] => failed
[direction] => outbound
)
)
';
preg_match_all('/\[([^]]+)\] => (?:Array(*SKIP)(*FAIL)|(.*?)\s+$)/m',$body,$out);
var_export(array_combine($out[1],$out[2]));
输出:
array (
0 => '32',
'uuid' => '92bbf05c-b49e-4950-9d4a-69c226325131',
'conversation_uuid' => 'CON-ee2287cb-ddb7-47e3-9595-0b4d36ac57e3',
'status' => 'failed',
'direction' => 'outbound',
)
它不是您预期数组的完美复制品 - 它已被展平 - 但它应该允许您获取所需的值。
答案 2 :(得分:0)
我创建了一个数组,并从那里获取了值。
<?php
require __DIR__ . '/../env.php';
//TransferLog Nexmo
header('Content-Type: application/json');
$json = file_get_contents('php://input');
$request = json_decode($json, true);
$id=$_GET['id'];
$body=array($id, $request);
$req_dump = print_r($body, true );
$fp = file_put_contents('callnexmo.log', $req_dump);
$conn = new mysqli($servername, $username, $password, $database);
foreach ($body as $value)
{
$status=$body[1]["status"];
$to=$body[1]["to"];
$from=$body[1]["from"];
$id=$body[0];