Как грамотно сделать дерево из массива?

dmitrybelyakov

Новичок
Как грамотно сделать дерево из массива?

Добрый день,

Имеется массив (список) неограниченный по размеру. Приблизительно следущего вида:

20040810152600
20040809100000
20040810150300
20040810150400
20050810160000
20040910161100
20041010161100
20041110161100
20051110161200
20050110161200
20050210161200
20050310161300
20050510161300

Каждая запись - дата в формате YYYYMMDDHHMMSS.
Каким образом наиболее эффективно переформатировать этот массив, чтобы получить массив вида:

$tree("year"=>"год", "months"="массив уникальных месяцев в этом году").


Всем заранее спасибо за любые ответы.
 

antiportal

Guest
Если я правильно понял:
Пробегая весь список,
1. отрезаем первые четыре знака (год), проверяя на наличие в $tree этих четырех знаков(года), если нет, то добавляем.
2. отрезаем следующие 2 знака (месяц), проверяя их наличие в уже отрезанном годе, если еще нет, то добавляем. Оставшуюся строку тоже можно покромсать по дням, времени и т.п.
 

.des.

Поставил пиво кому надо ;-)
PHP:
for($i=0, $c=sizeof($arr); $i<$c; $i++)  $_t[substr($arr[$i],0,4)][substr($arr[$i],4,2)] = 1;
foreach($_t as $year=>$months) $res[] = array('year'=>$year, 'months'=>array_keys($months));
 

alpine

Новичок
dmitrybelyakov
Это у тебя из MySQL?
Похоже на timestamp из мускуля...
 

confguru

ExAdmin
Команда форума
Dallas

Каждая запись - дата в формате YYYYMMDDHHMMSS.
Возьмем к примеру 100лет
Умножим на 12мес (которые есть)

Итого имеем 1200 элементов массива (за 100лет)

Внимание вопрос - что оптимальней обойти заранее известный массив или неограниченный по размеру массив?
 

Dallas

Guest
admin, не совсем понял, про какой неизвестный массив ты говоришь? (если ты про исходный, то как ты без его "обхода" получаешь доступ к след. элементу?)
Не понимаю смысл твоего сообщения.
 

confguru

ExAdmin
Команда форума
Dallas

Я про то что для решения проблемы есть 2 решения как минимум.. :)
 

dmitrybelyakov

Новичок
Originally posted by .des.
PHP:
for($i=0, $c=sizeof($arr); $i<$c; $i++)  $_t[substr($arr[$i],0,4)][substr($arr[$i],4,2)] = 1;
foreach($_t as $year=>$months) $res[] = array('year'=>$year, 'months'=>array_keys($months));
Это, мать его, вуду.
Спасибо.

Я в принципе уже и сам сделал - только у меня это на 20 строчек кода растянулось.

Респекты.

P.S. Ушел медитировать над новым куском кода.
 

alpine

Новичок
Такой код:
PHP:
mysql_connect("localhost", "user", "some_password") or die("Could not connect: " . mysql_error());
mysql_select_db("log");

$sql = 'SELECT DISTINCT(YEAR(date)) as year FROM logger';
$result = mysql_query($sql);

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
	$date[]['year'] = $row['year'];
}
mysql_free_result($result);

foreach($date as $key=>$val) {
	$sql = 'SELECT DISTINCT(MONTH(date)) as month FROM logger WHERE YEAR(date) =' . $val['year'];
	$result = mysql_query($sql);

    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
		$date[$key]['months'][] = $row['month'];
	}
    mysql_free_result($result);
}


echo '<pre>';
print_r($date);
echo '</pre>';
выполнялся 5,6 сек при 278237 записях в таблице logger, Celeron 900, 384М ОЗУ, ОС SuSE Linux 9.1, Apache2, php 4.3.4

-~{}~ 10.08.04 22:19:

Выгрести все записи вида:
20040810152600
банально не удалось -
Fatal error: Allowed memory size of 20971520 bytes exhausted
 

dmitrybelyakov

Новичок
Originally posted by alpine
Такой код:
PHP:
mysql_connect("localhost", "user", "some_password") or die("Could not connect: " . mysql_error());
mysql_select_db("log");
.............
Выгрести все записи вида:
20040810152600
банально не удалось - 
Fatal error: Allowed memory size of 20971520 bytes exhausted [/B][/QUOTE]
То есть это хорошая тема, если в таблице очень много записей. Я правильно понял?
 

Screjet

Новичок
а что мешает группировать мускулом, типа group by year(`field`), month(`field`) .. etc

?
 
Сверху