使用 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() 时删除数组索引引用的主要内容,如果未能解决你的问题,请参考以下文章