如果array_diff在Collection-> toArray()

时间:2018-06-06 02:16:50

标签: laravel laravel-5 laravel-5.5

我的问题是在我的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

2 个答案:

答案 0 :(得分:1)

替换

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

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

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

答案 1 :(得分: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,
   ]