如果 array_diff 在 Collection->toArray() 上返回 assoc 数组,则 JSON 是对象而不是数组

问题描述 投票:0回答:2

我的问题是在我的 json 中,我期待一个数组,但得到一个对象。

详情:

我有一个数字数组:

$numbers = [1];

我从关系中选择“抽奖号码”:

    $drawnNumbers = Ball::whereIn('number', $numbers)->where('game_id', $card->game->id)->get()->map(function($ball) {
        return $ball->number;
    })->toArray();

我在这里做了一个

->toArray()
。我想找到
$numbers
中没有出现在
$drawnNumbers
中的数字。我这样做是这样的:

$numbersNotYetDrawn = array_diff($numbers, $drawnNumbers);

我的方法

return $numbersNotYetDrawn
(我的标头接受的是application/json)。

现在问题来了。当

$drawnNumbers
为空数组时,则打印的 json 是一个常规数组,如下所示:

[
    1
]

但是,如果关系返回

$drawnNumbers
是一个包含数字的数组,则 json 会作为对象打印:

{
    "0" => 1
}

有谁知道这是为什么吗?无论如何要确保 json 是数组?

编辑:

这是我的实际数据:

$drawnNumbers = Ball::whereIn('number', $numbers)->where('game_id', $card->game->id)->get()->map(function($ball) {
            return $ball->number;
        })->toArray();

$undrawnNumbers = array_diff($numbers, $drawnNumbers);
// $undrawnNumbers = array_values(array_diff($numbers, $drawnNumbers)); // temp fix
php arrays laravel filtering reindex
2个回答
4
投票

更换

$numbersNotYetDrawn = array_diff($numbers, $drawnNumbers);

$numbersNotYetDrawn = array_values(array_diff($numbers, $drawnNumbers));

确保元素键被重置,并且数组被视为简单列表并序列化为 JSON 列表 - 而不是被视为关联数组并序列化为 JSON 对象。


0
投票

我最近遇到了同样的问题并想知道同样的事情。 我通过添加“array_values”解决了这个问题,但我想知道如何重现它。 我发现当

array_diff
从数组中删除不是最后一个元素的元素时,它会被再现。所以:

>>> $x
=> [
     1,
     2,
     3,
     4,
     5,
   ]
>>> array_diff($x, [5]);
=> [
     1,
     2,
     3,
     4,
   ]
>>> array_diff($x, [1]);
=> [
     1 => 2,
     2 => 3,
     3 => 4,
     4 => 5,
   ]
© www.soinside.com 2019 - 2024. All rights reserved.