【问题标题】:Removing array index reference when using json_encode()使用 json_encode() 时删除数组索引引用
【发布时间】:2013-12-20 19:10:16
【问题描述】:

我使用 jQuery 的 datepicker 制作了一个小型应用程序。我正在从如下所示的 JSON 文件中为其设置不可用日期:

{ "dates": ["2013-12-11", "2013-12-10", "2013-12-07", "2013-12-04"] }

我想检查给定的日期是否已经在此列表中,如果是,则将其删除。我当前的代码如下所示:

if (isset($_GET['date'])) //the date given
{
    if ($_GET['roomType'] == 2)
    {
        $myFile = "bookedDates2.json";
        $date = $_GET['date'];
        if (file_exists($myFile))
        {
            $arr = json_decode(file_get_contents($myFile), true);
            if (!in_array($date, $arr['dates']))
            {
                $arr['dates'][] = $_GET['date']; //adds the date into the file if it is not there already
            }
            else
            {
                foreach ($arr['dates'] as $key => $value)
                {
                    if (in_array($date, $arr['dates']))
                    {
                        unset($arr['dates'][$key]);
                        array_values($arr['dates']);
                    }
                }
            }
        }

        $arr = json_encode($arr);
        file_put_contents($myFile, $arr);
    }
}

我的问题是,在我再次对数组进行编码后,它看起来像这样:

{ "dates": ["1":"2013-12-11", "2":"2013-12-10", "3":"2013-12-07", "4":"2013-12-04"] }

有没有办法在 JSON 文件中找到日期匹配项并将其删除,而密钥不会出现在编码之后?

【问题讨论】:

  • 看起来不像,而是像这样:{ "dates": {"1":"2013-12-11", "2":"2013-12-10", "3":"2013-12-07", "4":"2013-12-04"} }。 diff:花括号包裹一个对象

标签: php jquery json


【解决方案1】:

使用array_values() 处理您的问题:

$arr['dates'] = array_values($arr['dates']);
//..
$arr = json_encode($arr);

为什么?因为您在不重新排序的情况下取消设置数组的键。因此,在此之后,将其保留在 JSON 中的唯一方法也将是编码密钥。但是,在应用array_values() 之后,您将获得有序的密钥(从0 开始),可以在不包括密钥的情况下正确编码。

【讨论】:

  • @DanieleCruciani it does
  • 是的,对不起。我的误解是关于 json 定义,以及 php 对它有多少迂腐。 Node Js接受将数组解析为json对象,实际上a=[];JSON.stringify(a);输出“[]”,因为typeof a输出“object”。在 PHP 中这是不可能的,因为根据它自己的定义,数组类型不是对象(就像在 javascript 中一样),但是 php 假装比 js 引擎更了解 js。
【解决方案2】:

您在现有尝试重新索引数组时忽略了array_values 的返回值。正确的是

$arr['dates'] = array_values($arr['dates']);

重新索引也应该移到foreach循环之外,多次重新索引没有意义。

【讨论】:

    【解决方案3】:

    Laravel collections(以防万一)你可以这样做

        $newArray = $collection->values()->toArray();
    

        $jsonEncoded = $collection->values()->toJson();
    

    【讨论】:

    • 这对于收藏来说是一个非常干净的答案。 $collection->values()->toJson( JSON_PRETTY_PRINT ); 非常适合将经过美化的 json 保存到文件中。
    • @Second2None 你是对的。谢谢 :) 你可能想建议它作为编辑
    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2011-10-01
    • 2015-07-19
    • 2013-07-04
    • 2019-02-15
    相关资源
    最近更新 更多