【问题标题】:Manually build JSON encodable array in PHP在 PHP 中手动构建 JSON 可编码数组
【发布时间】:2011-03-28 11:16:29
【问题描述】:

这有点奇怪。我有一个 CSV,我正在上传并传递给 PHP 脚本,该脚本将其解析为数组,将其编码为 JSON 字符串并将其发送回以由我的 Javascript 进一步处理。但是,我很难以易于解析的格式获取响应。也许可以解析,我只是不确定如何访问其中的数据。

用于处理和解析 CSV 的 PHP 脚本:

<?php
 $file = $_FILES['file'];
 $tmp = $file['tmp_name'];
 $row = 1;
 $json = array();
 if(($handle = fopen($tmp, 'r')) !== false){
  while(($data = fgetcsv($handle, 10000, '\n')) !== false){
   $num = count($data);
   $row++;

   for($i = 0; $i < $num; $i++){
    $values = split(',', $data[$i]);

    $value = array(
     sName => $values[0],
     sNick => $values[1],
     sEmail => $values[2],
     sSSOID => $values[3],
     sPwd => $values[4],
     sConfPwd => $values[5],
     sDescr => $values[6]
    );

    array_push($json, $value);
   }
   print_r(json_encode($json));
  }
  fclose($handle);
 }
?>

输出最终成为一个迭代响应,其中第一个数组包含 CSV 的第一行,第二个数组包含第一行和第二行(第三个数组包含第一、第二和第三等) .最后一个数组是我想要的响应。它是一个格式良好的 JSON 字符串;我只是不确定如何仅获得该响应。

示例响应:

  [{"sName":"John Doe","sNick":"John","sEmail":"jdoe@email.com","sSSOID":"jdoe","sPwd":"Admin1234","sConfPwd":"Admin1234","sDescr":"Likes cats"}][{"sName":"John Doe","sNick":"John","sEmail":"jdoe@email.com","sSSOID":"jdoe","sPwd":"Admin1234","sConfPwd":"Admin1234","sDescr":"Likes cats"},{"sName":"Bill Frank","sNick":"Bill","sEmail":"bfrank@email.com","sSSOID":"bfrank","sPwd":"Admin1234","sConfPwd":"Admin1234","sDescr":"Likes dogs"}][{"sName":"John Doe","sNick":"John","sEmail":"jdoe@email.com","sSSOID":"jdoe","sPwd":"Admin1234","sConfPwd":"Admin1234","sDescr":"Likes cats"},{"sName":"Bill Frank","sNick":"Bill","sEmail":"bfrank@gmail.com","sSSOID":"bfrank","sPwd":"Admin1234","sConfPwd":"Admin1234","sDescr":"Likes dogs"},{"sName":"Sam Smith","sNick":"Sam","sEmail":"ssmith@email.com","sSSOID":"ssmith","sPwd":"Admin1234","sConfPwd":"Admin1234","sDescr":"Likes music"}]

我需要的唯一响应是最终数组:

[{"sName":"John Doe","sNick":"John","sEmail":"jdoe@email.com","sSSOID":"jdoe","sPwd":"Admin1234","sConfPwd":"Admin1234","sDescr":"Likes cats"},{"sName":"Bill Frank","sNick":"Bill","sEmail":"bfrank@email.com","sSSOID":"bfrank","sPwd":"Admin1234","sConfPwd":"Admin1234","sDescr":"Likes dogs"},{"sName":"Sam Smith","sNick":"Sam","sEmail":"ssmith@email.com","sSSOID":"ssmith","sPwd":"Admin1234","sConfPwd":"Admin1234","sDescr":"Likes music"}]

【问题讨论】:

    标签: php json csv


    【解决方案1】:

    试试这个:

    $index = count($json) - 1;
    echo json_encode($json[$index]);
    

    【讨论】:

    • 效果很好:)。那么,我将如何访问第一个用户的 'sName' 值呢?我试过'警报(数据[0] .sName);'但这是“不行”。
    • 查找数据的格式有时很痛苦。试着弄清楚data 究竟是什么——它是一个对象数组,还是一个对象本身。
    • 它似乎是一个对象数组:[{'a':'1', 'b':'2', 'c':'3'},{'d':' 4', 'e':'5', 'f':'6'},{'g':'7', 'h':'8', 'i':'9'}]
    【解决方案2】:

    将此行移到 fclose 之后:

    print_r(json_encode($json));
    

    【讨论】:

    • 完美!我会以 'data[i].sName;' 的形式访问数据对吗?
    • 取决于 javascript 的设置方式,但这应该可以工作。
    【解决方案3】:

    在您的 Javascript 应用程序中解码 JSON,这将生成一个数组,然后使用 .pop() 获取最后一个值:

    var json = json_decode('[{"sName" ......... ');
    var lastelement = json.pop();
    

    【讨论】:

    • 这是对带宽和资源的严重浪费。删除服务器端不必要的部分,而不是编码、传输和解码它们只是为了立即丢弃它们。
    • OP没有说他是要处理服务器端还是客户端,所以我提供了客户端解决方案。
    【解决方案4】:

    你可能想使用

    $json[] = $value;
    

    而不是array_push

    echo json_encode($json);
    

    而不是print_r。此外,将 print_r/echo 调用移出 while 循环。

    【讨论】:

    • +1 不知道为什么人们在想要有效的 json 时说 print_r
    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2022-10-08
    • 2011-08-07
    相关资源
    最近更新 更多