У меня есть следующий массив:
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"
Я делал логику, похожую на эту, и у нее есть работа, но теперь я, кажется, могу ошибиться.
Кто-нибудь может мне помочь?
$body
строка не массив, потому что file_get_contents
возвращает содержимое файла, которое является строкой. Так что вы не можете работать с $body
как с массивом.
Вы можете анализировать данные из строки с помощью регулярных выражений (взгляните на pre_match а также preg_match_all функции).
На самом деле ваше первое утверждение неверно. У вас есть строка, которая «выглядит» как массив.
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
И структура массива надежна, тогда вы можете сделать это как можно лучше. пытаться разобрать его с помощью регулярного выражения, но это может или не может быть надежным усилием.
Учитывая ваши опубликованные данные, вот простая демонстрация 🙁Образец Демо) (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',
)
Это не идеальная копия ожидаемого массива — он сплющен — но он должен позволить вам получить нужные значения.
Я создал массив и получил значения оттуда.
<?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];