如何从数组返回值?

时间:2017-09-05 09:18:33

标签: php arrays

我有以下数组:

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"

我一直在做类似于这个的逻辑,它有工作,但现在我似乎可以把我的手指放在错误的.. 有人可以帮助我吗?

3 个答案:

答案 0 :(得分:0)

$body是字符串而不是数组,因为file_get_contents返回的文件内容是字符串。因此,您无法像使用数组一样使用$body

您可以使用regexp解析字符串中的数据(请查看pre_matchpreg_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];