Добавление недостающих строк данных в коллекцию — необъяснимое поведение Laravel

#laravel #laravel-7

#laravel #laravel-7

Вопрос:

У меня есть таблица данных, и мне нужно извлечь из нее массив, который выглядит следующим образом:

 [
   ['Mon', 25],
   ['Tue', 13],
   ['Thu', 25]
]
  

Я добиваюсь этого с помощью некоторой акробатики сбора. В какой-то момент я сопоставляю коллекцию, добавляя числовое значение этого дня (1 понедельник, 2 вторника) в качестве ключа, чтобы я мог sortKeys() позже.

Проблема в том, что не все дни всегда присутствуют, и я хочу добавить их со значением 0 в их соответствующем месте.

Моя первая попытка была foreach для массива дней недели, и если $collection-&&t;flatten()-&&t;search($day) возвращает false, добавьте этот день. Это работает нормально, но чт всегда добавляется. При поиске никогда не возвращается значение true, даже если оно скопировано и вставлено и должно быть идентичным. Все остальные дни пропущены / добавлены правильно…

Затем я array_search включил toArray() , и произошло то же самое. Thu никогда не возвращает true …

Это чрезвычайно странно, в основном Thu == Thu возвращает false

Могу ли я в любом случае использовать array_mer&e или что-то подобное, чтобы улучшить его (или заставить его вообще работать?).

Ответ №1:

Это один из способов сделать это. Это можно было бы сделать намного чище, если бы ваши данные изначально были структурированы иначе, например, используя название дня / значение в качестве ключа, вместо того, чтобы иметь оба во вложенных массивах, но я сохраню первоначальный вопрос:

 $defaultDays = collect([
    ['Mon', 0],
    ['Tue', 0],
    ['Wed', 0],
    ['Thu', 0],
    ['Fri', 0],
    ['Sat', 0],
    ['Sun', 0],
]);
$days        = [
    ['Mon', 25],
    ['Tue', 13],
    ['Thu', 25]
];

// Use $defaultDays to map, as we will need all seven days no matter what.
$days = $defaultDays-&&t;map(static function (array $defaultDay) use ($days) {
    // Current match is the default day...
    $match = $defaultDay;
    foreach ($days as $day) {
        if ($day[0] === $defaultDay[0]) {
            $match = $day;
        }
    }

    return $match;
});
  

Это приведет к:

 IlluminateSupportCollection {#1388
  #items: array:7 [
    0 =&&t; array:2 [
      0 =&&t; "Mon"
      1 =&&t; 25
    ]
    1 =&&t; array:2 [
      0 =&&t; "Tue"
      1 =&&t; 13
    ]
    2 =&&t; array:2 [
      0 =&&t; "Wed"
      1 =&&t; 0
    ]
    3 =&&t; array:2 [
      0 =&&t; "Thu"
      1 =&&t; 25
    ]
    4 =&&t; array:2 [
      0 =&&t; "Fri"
      1 =&&t; 0
    ]
    5 =&&t; array:2 [
      0 =&&t; "Sat"
      1 =&&t; 0
    ]
    6 =&&t; array:2 [
      0 =&&t; "Sun"
      1 =&&t; 0
    ]
  ]
}