Код: Выделить всё
// База данных (по идеи, читается из файла)
$array = array();
$array[0] = "98|2009-10-09 2:48:29|211.138.124.228";
$array[1] = "101|2009-10-09 2:49:39|87.98.143.239";
$array[2] = "106|2009-10-09 2:50:08|189.21.54.50";
$array[3] = "105|2009-10-09 2:50:34|195.158.1.19";
$sort = 1; // По какой ячейке сортировать
$desc = true; // true - в обратном порядке, false - по проядку
$separator = "|"; // Разделите ячеек базы данных
$sort_array = array(); // Временное хранилище, которое и будем сортировать
$return_array = array(); // Массив, который в конце работы возвратит функция
for( $i = 0; $i < count( $array ); $i++ )
{
// Читаем запись базы данных и какдаем в массив
$array[$i] = explode( $separator, $array[$i] );
// С тем же ключём, что и выше помещаем нужную ячейку для сортировки
$sort_array[$i] = stripslashes( $array[$i][$sort] );
}
// Смотрим на способ сортировки
if( $desc )
{
// Сортируем в обратном порядке
arsort( $sort_array );
}
else
{
// Сортируем по порядку
asort( $sort_array );
}
// Перемалываем ключи
reset( $sort_array );
// Уже в пустой массив (ключ имеется в виду) кидаем таблицу базы данных
foreach( $sort_array as $key => $value ){ $return_array[] = $array[$key]; }
// Ну а это мы просто выводим для проверки (потом удалим конечно)
foreach( $return_array as $key => $value ){ echo "{$key} - {$value[$sort]}
"; }
Впринципе с 100-ей таблиц мой способ написанный выше справится быстро. Но их будет не сотни, а сотни тысяч и может больше (поэтому от MySQL я отказался). Дак вот вопрос, есть ли спец. функция в PHP, чтобы выполнить такое, или как можно попроще выполнить такую операцию? Если не совсем понятно, то необходимо выполнить сделать то же самое, что и в MySQL:
При тесте в ровно 50000 строк, данный код справляется за 1.2 сек, в то время кода Mysql с тем же объёмом базы данных и тойже сортировкой почти не тратит на это время. Самые длительные операции в данном скрипте:SELECT * FROM `база` ORDER BY `date` DESC
Код: Выделить всё
$sort_array[$i] = stripslashes( $array[$i][$sort] ); - Тратит на всё про всё 0.6 сек.
$array[$i] = explode( $separator, $array[$i] ); - Тратит на это 0.5 сек.
Вот написал функцию, может так понятней будет:
Код: Выделить всё
function ReturnArrayStats( $array, $start = 0, $limit = 10, $sort = 0, $desc = true, $separator = "|" ){
$sort_array = array(); // Временное хранилище, которое и будем сортировать
$return_array = array(); // Массив, который в конце работы возвратит функция
for( $i = 0; $i < count( $array ); $i++ )
{
$array[$i] = trim( $array[$i] );
// Читаем запись базы данных и какдаем в массив
$array[$i] = explode( $separator, $array[$i] );
// С тем же ключём, что и выше помещаем нужную ячейку для сортировки
$sort_array[$i] = stripslashes( $array[$i][$sort] );
}
// Смотрим на способ сортировки
if( $desc )
{
// Сортируем в обратном порядке
arsort( $sort_array );
}
else
{
// Сортируем по порядку
asort( $sort_array );
}
// Перемалываем ключи
reset( $sort_array );
// Уже в пустой массив (ключ имеется в виду) кидаем таблицу базы данных
$i = 0;
$i_limit = 0;
foreach( $sort_array as $key => $value )
{
if( $i >= $start )
{
if( $i_limit < $limit )
{
$return_array[] = $array[$key];
$i_limit++;
}
else
{
break;
}
}
$i++;
}
return $return_array;
}
// База данных
$array = file('bd.txt' );
$return_array = ReturnArrayStats( $array );
// Ну а это мы просто выводим для проверки (потом удалим конечно)
foreach( $return_array as $key => $value ){ echo "{$key} - {$value[1]}
"; }
Место операции "for" пробовал "while" и "foreach" - не помогает, времени затрачивает абсолютно одинкаво. "ArrayMultiSort" - не даёт нужного результата.98|2009-10-09 2:48:29|211.138.124.228
101|2009-10-09 2:49:39|87.98.143.239
106|2009-10-09 2:50:08|189.21.54.50
105|2009-10-09 2:50:34|195.158.1.19
Блин ну люди, должен же хоть кто-то что-то знать на счёт этого. Я 5 часов гуглил, было похожее, но совсем не то. Там была сортировка по всем ячейкам массива, а мне надо по конкретной и расчитывать на все данные, а не только по двум массивам. Мне нужно хотябы оптимизировать один процесс, который тратит 0.6 сек.