使用 json_encode() 时删除数组索引引用

Posted

技术标签:

【中文标题】使用 json_encode() 时删除数组索引引用【英文标题】:Removing array index reference when using 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:花括号包裹一个对象 【参考方案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 你是对的。谢谢 :) 你可能想建议它作为编辑

以上是关于使用 json_encode() 时删除数组索引引用的主要内容,如果未能解决你的问题,请参考以下文章

我希望 PHP 中的 json_encode 返回一个 JSON 数组,即使索引不正确

使用花哨的索引从 Numpy 数组中查找和删除全零列

Pandas 重置系列索引以删除多索引

Pandas 重置系列索引以删除多索引

PHP数组到JSON数组使用json_encode();

删除每个索引的多索引熊猫数据帧的最低五个值