[TC] PHP: Как убрать пустые элементы массива?
Vande omentaina, Tiflocomp!
Есть такая задача.
Есть чат, в котором сообщения имеют дату (тип поля Datetime).
Некоторым пользователям надо видеть лог этого чата. Поскольку лог
огромный, я решил выдать им список дней, после выбора дня уже показать
лог по этому дню.
Я пока решаю задачу так: выбираю всю таблицу, загоняю её в массив и
получаю дни. Вот кусок кода:
echo "<form action=\"showlog.php\" method=post>
<select name=uday size=1>";
$q=mysql_query("SELECT `Date` FROM `Chat`", $link);
for ($i=0; $i<mysql_num_rows($q); $i++) {
$f=mysql_fetch_array($q);
// Отрезаем время
$DateAndTime=explode (" ", $f[Date]);
$date=$DateAndTime[0];
// Накапливаем массив дней
$d[$i]=$date;
}
// Поскольку записей много, надо получить уникальные дни
$d=array_unique ($d);
// Внимание! что надо написать вместо этой функции, чтобы в списке
// выводились только существующие элементы?
array_values ($d);
// Ну а дальше просто обработка, чтобы выводилось "10 мая 2009 года",
// а не "2009-05-10
for ($y=0; $y<count($d); $y++) {
$DateWithoutTime=explode ("-", $d[$y]);
$year=$DateWithoutTime[0];
$month=$DateWithoutTime[1];
$day=$DateWithoutTime[2];
switch ($month) {
case "01": $month="января"; break;
case "02": $month="февраля"; break;
case "03": $month="марта"; break;
case "04": $month="апреля"; break;
case "05": $month="мая"; break;
case "06": $month="июня"; break;
case "07": $month="июля"; break;
case "08": $month="августа"; break;
case "09": $month="сентября"; break;
case "10": $month="октября"; break;
case "11": $month="ноября"; break;
case "12": $month="декабря"; break;
}
echo "<option value=\"$d[$y]\"> $day $month $year</option>";
}
echo "</select>";
Итак, вопросы:
1. Можно ли всё это сделать менее громоздко: например, как-нибудь с
помощью DISTINCT выбрать уникальные даты; вообще выбирать не все
записи...?
2. Как убрать пустые элементы (пересортировать массив)? что я имею в
виду: в чате, скажем, 50000 сообщений. В такой-то день их было 700. И
вот даже после array_unique() остаются 700 пустых элементов, которые
выводятся в списке. Или не выводятся, но список обрывается где-то на
втором дне (потому что так странно работает count). Как это обойти?
Извините за ламерство, но что-то не догоняю...
Спасибо!
Доброго времени суток, уважаемая рассылка и Anarendil.
Sunday, May 10, 2009, 2:43:29 PM, you wrote:
function getMonth($n)
{
$month = array("января", "февраля", "марта", "апреля", "мая", "июня", "июля",
"августа", "сентября", "октября", "декабря");
$n = ($n - 1) % 12;
return $month[$n];
}
while ($row = mysql_fetch_array($q))
{
$DateAndTime=explode (" ", $row['Date']);
// элементы с одинаковыми ключами (датами) будут просто перекрываться
$d[$date] = preg_replace("/([0-9]{4,4})-([0-9]{2,2})-([0-9]{2,2})/e", "'\\3 '.getMonth('\\2').'
\\1'", $date);
', $date);
foreach ($d as $date => $str)
{
echo "<option value=\"$date\"> $str</option>";
см. вариант выше. Строки без "A>" были мною изменены.
Пожалуйста!
п.с. если будет бить какие-то ошибки, пишите (писал на память и без
тестирования).