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

dmitrybelyakov

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

Добрый день,

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

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

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

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


Всем заранее спасибо за любые ответы.
 
Если я правильно понял:
Пробегая весь список,
1. отрезаем первые четыре знака (год), проверяя на наличие в $tree этих четырех знаков(года), если нет, то добавляем.
2. отрезаем следующие 2 знака (месяц), проверяя их наличие в уже отрезанном годе, если еще нет, то добавляем. Оставшуюся строку тоже можно покромсать по дням, времени и т.п.
 
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));
 
Dallas

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

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

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

Я про то что для решения проблемы есть 2 решения как минимум.. :)
 
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. Ушел медитировать над новым куском кода.
 
Такой код:
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
 
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]
То есть это хорошая тема, если в таблице очень много записей. Я правильно понял?
 
а что мешает группировать мускулом, типа group by year(`field`), month(`field`) .. etc

?
 
Сверху