【问题标题】:Name-value and key-value pairs both being created in PHP file (for json encode)名称-值和键值对都在 PHP 文件中创建(用于 json 编码)
【发布时间】:2014-12-19 04:31:41
【问题描述】:

我正在从 MySQL 数据库生成 PHP 数组,并使用 json_encode 将输出转换为 JSON(最终与 Twitter typeahead 一起使用)。

根据我所阅读的有关 PHP 数组的所有内容,我曾预计 select 查询会生成 - 对于任何记录 - 每列只生成一个键值对。

相反,我似乎得到both 名称-值对键-值对

例如,对于一个有 5 列的表,单条记录的值集采用以下形式:

[fieldname1] => value1 [0] => value1
[fieldname2] => value2  [1] => value2
[fieldname3]] => value3 [2] => value3 
[fieldname4]=> value4  [3] => value4 
[fieldname5] => value5 [4] => value5

当我使用 json_encode 时,它​​会为该记录生成以下 JSON 字符串 - 这是所需时间的两倍,因为我同时获得了名称-值对和键-值对(因此值重复非常线)。

"fieldname1":"value1","0":"value1",
"fieldname2":"value2","1":"value2",
"fieldname3":"value3","2":"value3",
"fieldname4":"value4","3":"value4",
"fieldname5":"value5","4":"value5",

我更喜欢 'fieldname1' => 'value1' 或其 json 等效项。

这是我在 PHP 中用于从数据库中选择数据的代码示例。

<?php 
$sql = "SELECT * FROM `tr_trades_anzsco` WHERE `trade_alias_id` > 898";
$trade = $dbh->query($sql);

    foreach($trade as $trade):  
            $trade_alias_id = $trade['trade_alias_id'];
            $trade_alias = trim($trade['trade_alias']);
            print_r($trade);
    endforeach; 
?>

这是仅包含三个记录的结果数据集。

Array ( [trade_alias_id] => 899 [0] => 899 [trade_alias] => Boilermaker [1] => Boilermaker [ANZSCO_title] => Structural Steel And Welding Trades Workers [2] => Structural Steel And Welding Trades Workers [ANZSCO_code] => 322300 [3] => 322300 [source] => Raj [4] => Raj ) Array ( [trade_alias_id] => 900 [0] => 900 [trade_alias] => Welder [1] => Welder [ANZSCO_title] => Structural Steel And Welding Trades Workers [2] => Structural Steel And Welding Trades Workers [ANZSCO_code] => 322300 [3] => 322300 [source] => Tom [4] => Tom ) Array ( [trade_alias_id] => 901 [0] => 901 [trade_alias] => Rigger [1] => Rigger [ANZSCO_title] => Construction Rigger [2] => Construction Rigger [ANZSCO_code] => 821711 [3] => 821711 [source] => Jack [4] => Jack )

最后,这里是仅用于最终记录的 json 字符串(分解以便更容易看到结构)。

Array ( [0] => Array (
[trade_alias_id] => 901 [0] => 901
[trade_alias] => Rigger [1] => Rigger 
[ANZSCO_title] => Construction Rigger [2] => Construction Rigger 
[ANZSCO_code] => 821711 [3] => 821711 
[source] => Jack [4] => Jack )
)

出于性能原因,重复值非常重要 - 因为要提取数据以在移动设备上使用(使用 Twitter TypeAhead 和可能的 AngularJS)。我们的数据集已经非常大了......所以两倍的 json 将使获取数据的时间加倍。

关键问题:如何在 PHP 阶段或 json_encode 阶段删除重复项,以便仅生成名称-值对,而不是同时生成名称-值和键值对?强>

谢谢!

【问题讨论】:

  • 你是如何到达 MySQL 的(mysql_、mysqli_、PDO)?你是如何获取结果的?

标签: php mysql arrays json key-value


【解决方案1】:

假设您正在使用 pdo:

$trade = $dbh->query($sql, PDO::FETCH_ASSOC);

【讨论】:

    【解决方案2】:

    如果key是int,你可以取消设置

    foreach($trade as $key=>$value) {
       if(!is_int($key) {
          unset($trade[$key]);
       }
    }
    

    希望这会有所帮助:D

    【讨论】:

    • 能否请您澄清一下我把这段代码放在哪里?听起来不错 - 但我不知道如何正确使用它。我尝试将它放在初始 foreach 块下方,但这不起作用(并且只是导致“T_PAAMAYIM_NEKUDOTAYIM”错误)。我应该将您的代码块嵌套在现有的 foreach 中吗?
    • 将它放在初始 foreach 之前。它将重写直接来自数据库的 $trade
    • :)) 错误是因为 $key=&gt;value 它确实是一个解析错误:D 它应该是 $key=&gt;$value 。记住:总是关于 $
    猜你喜欢
    • 2021-08-18
    • 2022-01-25
    • 1970-01-01
    • 2011-08-22
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多