【问题标题】:PHP Explode new line into an array for jsonPHP将新行分解为json的数组
【发布时间】:2013-11-12 15:48:16
【问题描述】:

我的数据库 (mysql) 中有数据,我正试图以 json 格式将其拉到一个页面,以便我可以挑选这些数据以供将来参考。

当前数据输出

{
    "quotes": [
        {
            "season": "3",
            "episode": "2",
            "lines": [
                "Boys:\tSchool day, school day, teacher's golden ru\nKyle:\tAh, damn it! My little brother's trying to follow me to school, again. "
            ]
        },
        {
            "season": "1",
            "episode": "2",
            "lines": [
                "Episode 2 "
            ]
        }
    ]
}

我正在努力解决的部分是让lines 像这样显示

"lines": [
           {"Boys": "School day, school day, teacher's golden ru"},
           {"Kyle": "Ah, damn it! My little brother's trying to follow me to school, again."}
         ]

我拥有的 PHP

$result = $con->query("SELECT * FROM quotes");
$response = array();
$i=0;
while ($row = $result->fetch_assoc()) { 
    $response[$i]['season']= $row['season'];
    $response[$i]['episode']= $row['episode'];
    $response[$i]['lines'] = explode('\n', $row['lines']);
    $data['quotes'][$i] = $response[$i];
    $i=$i+1;
}
$json_string = json_encode($data);

echo $json_string;

如果有人可以提供帮助,那就太好了!

【问题讨论】:

  • lines 键的问题在于,每行所说的键都没有不同,例如 BoysKyle。我想这是因为Kyle 可能会说 2 行,这将用他最后说的行覆盖每一行。行的结构是否有规则,例如\n 总是每个的结束,\t 是一个新的开始?

标签: php string escaping interpolation


【解决方案1】:
explode('\n', $row['lines']);

应该是

explode("\n", $row['lines']);

注意双引号。前反斜杠表示的控制字符必须用双引号括起来。

【讨论】:

  • 感谢这项工作并显示为"Boys:\tSchool day, school day, teacher's golden ru",,但有没有办法像{"Boys": "School day, school day, teacher's golden ru"},一样获得它
  • 如果你的意思是删除标签 (\t) 只需做 explode("\n", str_replace("\t", "", $row['lines']))
【解决方案2】:

替换

$response[$i]['lines'] = explode('\n', $row['lines']);

$lines = explode("\n", $row['lines']);
$indexedLines = array();

foreach( $lines as $thisLine ) {
    $sepIndex    = strpos( $thisLine, ":\t" );
    $lineIndex   = substr( $thisLine, 0, $sepIndex );
    $lineContent = substr( $thisLine, $sepIndex + 2 );
    $indexedLines[ $lineIndex ] = $lineContent;
}
$response[$i]['lines'] = $indexedLines;

对于允许每个扬声器多行并保留行的顺序的模型,请替换:

$indexedLines[ $lineIndex ] = $lineContent;

大致如下:

$indexedLines[] = array( 'speaker' => $lineIndex, 'line' => $lineContent );

【讨论】:

  • 这段代码似乎做了我想要的,但它缺少大量的输出。试图弄清楚输出中是否有引号
  • 如果您可以提供更多数据,那么我相信它可以解决,但发布的答案将准确地输出您所提供示例所需的内容......
  • 最明显的问题是您建议的数据格式只允许每人一份报价。例如。 “男孩”的第二个引用将覆盖第一个。
  • 在这种情况下,您所要求的根本不可能。你说的数据格式不允许。也许稍微不同的格式会给你你正在寻找的东西。
  • IE您对 lines 数组的描述是:我想要一个数组,其中每个元素的索引是说话人的姓名,内容是说话的行。这只允许每人一行。
【解决方案3】:
$line = array();
$lines = array();

$line['Boys'] = "School day, school day, teacher's golden ru";
$line['Kyle'] = "Ah, damn it! My little brother's trying to follow me to school, again.";

$lines['lines'] = $line;

祝你好运!

【讨论】:

  • 您能否解释一下您发布的代码中出现的问题的答案,以便用户和未来的读者可以从中学习?
猜你喜欢
  • 2022-11-30
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多