PHP - подсчитать, сколько раз значение в одном массиве появляется в другом массиве, а затем создать массив, содержащий числа - PullRequest
0 голосов
/ 05 октября 2018

У меня есть два массива, оба в формате Ymd.Один массив - это количество дней, прошедших в текущем месяце, а один - список, когда каждый пользователь моего приложения был создан в формате Ymd.Я хочу создать третий массив, который подсчитывает количество раз, которое пользователь создавал в определенный день в моем массиве дней месяца, а затем помещает это число в третий массив.

Мой код до сих порthis:

$daysInCurrentMonth = date('t');
$daysPast = date('j');
$month = date('m');
$year = date('y');

$participants = DB::table('participants')->get();
$createdAt = $participants->pluck('created_at');

foreach($createdAt as $created)
{
    $dateTimes[] = Carbon::createFromFormat('Y-m-d H:i:s', $created)->format('Y-m-d');
}

$dates = $this->generateDateRange(Carbon::parse($year.'-'.$month.'-01'), Carbon::parse($year.'-'.$month.'-'.$daysPast));

Массив $ date имеет:

array (size=5)
  0 => string '2018-10-01' (length=10)
  1 => string '2018-10-02' (length=10)
  2 => string '2018-10-03' (length=10)
  3 => string '2018-10-04' (length=10)
  4 => string '2018-10-05' (length=10)

Массив $ dateTimes имеет:

array (size=6)
  0 => string '2018-09-21' (length=10)
  1 => string '2018-09-24' (length=10)
  2 => string '2018-09-24' (length=10)
  3 => string '2018-10-02' (length=10)
  4 => string '2018-10-04' (length=10)
  5 => string '2018-10-04' (length=10)

Я хочу, чтобы третий массив прошел через все циклычисло дней в $ date и для каждой даты не существует 0, поэтому с учетом приведенных выше данных мой массив будет выглядеть так:

$matches = [0, 1, 0, 2, 0]

Я пробовал несколько функций PHP-массива, но ямне было интересно, если кто-нибудь может быстро помочь мне.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018
// the final array that holds umber of times user was created.
// as a key value pair ( 2018-01-01 => 5 )
$counts = [];

foreach ($dates as $date) {

    $count = 0;

    foreach ($dateTimes as $dateTime) {
        if ($date == $dateTime) $count++;
    }

    array_set($counts, $date, $count);
}
0 голосов
/ 05 октября 2018

Попробуйте что-то вроде этого:

// Groups $dateTimes by number of occurrences 
$registrations = array_count_values($dateTimes);

$matches = [];
foreach ($dates as $key => $date) {
    $matches[$key] = isset($registrations[$date]) ? $registrations[$date] : 0;
}

Если вы используете PHP 7.x, вы можете использовать $matches[$key] = $registrations[$date] ?? 0;, чтобы немного его сократить.

...