PHP, отсортировать массив с timestamp

120
04 мая 2021, 07:40

Имеется массив с timestamp-ми примерно с прошлого года (когда добавлялись пользователи). Надумала сделать статистику, но не пойму как можно день за днем отсортировать этот массив, чтобы вышло что-то типа

[
  '27.05.18' => 25,
  '28.05.18' => 5
]

Где 25 и 5 - соответственно количество пользователей за день. У меня же имеется просто список

 ["1597770786","1597771694","1597771715","1597776373","1597776819"],
Answer 1

Что-то мне подсказывает, что информация о зарегистрированных пользователях хранится вовсе не в текстовом файле. Скорее всего - в базе данных. Так почему бы не получить эти данные сразу запросом из БД? Например, если registered_at - поле типа TIMESTAMP, то запрос будет выглядеть как-то так:

SELECT
  DATE_FORMAT(registered_at, '%d.%m.%Y') AS registerDate,
  COUNT(*) AS usersCount
FROM users
GROUP BY DATE_FORMAT(registered_at, '%d.%m.%Y')
ORDER BY DATE_FORMAT(registered_at, '%d.%m.%Y');

Ну а если registered_at - это поле типа INTEGER, хранящее unix timestamp, то запрос будет имет примерно такой вид:

SELECT
  FROM_UNIXTIME(registered_at, '%d.%m.%Y') AS registerDate,
  COUNT(*) AS usersCount
FROM users
GROUP BY FROM_UNIXTIME(registered_at, '%d.%m.%Y')
ORDER BY FROM_UNIXTIME(registered_at, '%d.%m.%Y');

И выполнится быстрее, и возни меньше, и последующая обработка проще - данные уже отсортированы, сгруппированы и готовы к помещению в массив:

$result = [];
foreach ($pdo->query($sql) as $row) {
    $result[$row['registerDate']] = $row['usersCount'];
}

P.S. Варианты запроса представлены для MySQL.

Answer 2

Например так:

$arr =  ["1597770786","1597771694","1597771715","1564404622","1597776819"];
$result = [];
foreach($arr as $row){
    $date = date('d.m.Y', $row);
    isset($result[$date]) ? $result[$date]++ : $result[$date] = 1;
}
Answer 3

Предлагаю, для определения количества одинаковых значений в массиве, использовать ф-ю array_count_values().

Тогда задача сводится к преобразованию значений массива в строки, содержащих дату в формате "d.m.Y" и последующий подсчет, с помощью функции array_count_values(), кол-ва одинаковых значений:

<?php
$input = ["1597610786", "1597611786", "1597770786", "1597771694", "1597771715", "1597776373", "1597776819" ];
sort($input); // <--- если значения уже отсортированны - строчку можно удалить
$output = array_count_values(
    array_map(
        function ($itm) {
            return date('d.m.Y', $itm);
        },
        $input
    )
);
var_dump($output);

Вывод:

array(2) {
  '16.08.2020' =>
  int(2)
  '18.08.2020' =>
  int(5)
}
READ ALSO
Почему удаление в fieldset&#39;ах с конца?

Почему удаление в fieldset'ах с конца?

Есть база данных где есть 5 строк, каждая запись из бд идет на сайт в каждый фиелдсет, но когда нажимаю

111
Change Permalink

Change Permalink

проблема такова есть сайт , в нем категории , ссылка выглядит таким siteru/category-/category-b/category-c/postname, нужно чтобы она была вида site

89
Путь в функции move_uploaded_file

Путь в функции move_uploaded_file

Почему этот код работает $dest_url = get_home_path()"imagebase/1/"

80
Почему не срабатывает часть кода php-mysql?

Почему не срабатывает часть кода php-mysql?

Первая половина кода срабатывает, а код ниже (INSERT INTO) выдает ошибку запроса

89