【问题标题】:JSON giving unwanted row index number - Active Record - CodeigniterJSON 给出不需要的行索引号 - Active Record - Codeigniter
【发布时间】:2012-12-19 21:32:07
【问题描述】:

我不知道为什么当我回显 json_encode 查询结果集时,我会在每个对象之前得到结果行的编号。我只想计算返回的总行数,并让它们在 JSON 字符串的开头只显示一次,然后只返回行。 IE。使用以下代码:

               //...active record query
               $result = $this->db->get();

                $data = array();

                $count = 1;

                foreach($result->result() as $row)
                {
                    $data['count'] = $count;
                    $entry = array();
                    $entry['firstname'] = $row->first_name;
                    $entry['lastname'] = $row->last_name;
                    $entry['jobtitle'] = $row->title;
                    $entry['dept'] = $row->dept_name;
                    $entry['deptid'] = $row->dept_no;

                    if($row->emp_no == null)
                    {
                        $entry['ismanager'] = 0;
                    }
                    else
                    {
                        $entry['ismanager'] = 1;
                    }
                    $data[] = $entry;
                    $count++;
                }

                return $data;

然后在控制器中对其进行json_encode,我得到:

{"count":35,"0":{"firstname":"Georgi","lastname":"Facello","jobtitle":"Senior Engineer","dept":"Development","deptid":"d005","ismanager":0},"1":{"firstname":"Kirk","lastname":"Facello","jobtitle":"Senior Engineer","dept":"Development","deptid":"d005","ismanager":0},....rest of the query results

我不想要的是 "0""1" 等,在行结果之前。我已经有了返回结果的总数,所以我不需要单独的行号。

如果有人可以帮助我,我将不胜感激,谢谢。

【问题讨论】:

    标签: json codeigniter activerecord


    【解决方案1】:

    如果你尝试将一个数组序列化为 JSON,它会变成这样:

    [elem1, elem2, elem3, ...]
    

    但是如果那个“数组”有其他字段,那么它将被序列化为一个对象:

    {"field":value, "0":elem1, "1":elem2, "2":elem3, ...}
    

    由于没有办法用数组语法序列化field,而json_encode又不能简单地丢弃它,所以它使用对象语法。如the docs中所述:

    注意:

    对数组进行编码时,如果键不是从0开始的连续数字序列,则所有键都编码为字符串,并为每个键值对显式指定。

    一种可能的解决方法是将计数与元素列表分开:

    $data = array();
    $list = array();
    $data['list'] = list;
    
    $count = 1;
    foreach($result->result() as $row)
    {
        $data['count'] = $count;
        $entry = array();
        ...
        $list[] = $entry;
        $count++;
    }
    

    这将序列化为:

    {"count":35,"list":[{"firstname":"Georgi","lastname":"Facello","jobtitle":"Senior Engineer","dept":"Development","deptid":"d005","ismanager":0},{"firstname":"Kirk","lastname":"Facello","jobtitle":"Senior Engineer","dept":"Development","deptid":"d005","ismanager":0},....rest of the query results]}
    

    【讨论】:

    • 感谢修复它。你能引导我到某个地方,在那里我可以了解你刚刚解释的关于序列化的内容吗?谢谢
    • @AZ1 the docs 中的示例#3 显示了当给定一个缺少元素(或非顺序元素)的数组时json_encode 的行为方式。我的常识告诉我,如果该数组有“额外”字段(另见最后的注释),也会发生同样的情况。
    【解决方案2】:

    看起来您可能会在您的json_encode 上使用JSON_FORCE_OBJECT,这将始终使您的数字索引显示为属性。您应该在问题中显示您的json_encode 步骤。

    如果您关闭选项并使用默认编码,您仍需要将数字索引数组嵌套在其自己的属性中,否则数字索引将显示为属性以生成有效的 JSON。因为在将行分配给对象时可能会做这样的事情:

    $data['records'][] = $entry;
    

    【讨论】:

      猜你喜欢
      • 2015-01-29
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2014-06-26
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多