代码之家  ›  专栏  ›  技术社区  ›  Blagoh

如果array_diff在Collection->toArray()上返回assoc array,则JSON是object而不是array

  •  0
  • Blagoh  · 技术社区  · 8 年前

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

    现在是问题了。什么时候? $提款编号 是一个空数组,那么打印的json是一个常规数组,如下所示:

    [
        1
    ]
    

    $提款编号

    {
        "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
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   jedrzej.kurylo    8 年前

    替换

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

    具有

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

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

        2
  •  0
  •   Ibrahim Chawa    6 年前

    我通过添加“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,
       ]
    
    推荐文章