Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2011, 22:11   #1
Небесный
Зелень
Форумчанин
 
Аватар для Небесный
 
Регистрация: 03.02.2007
Сообщений: 302
По умолчанию Сортировка массива.

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

Сортировка может быть разная, как
по адресу [address]
по деньгам [cash]
по айпи [currip]
Да и т.д., практически по каждому полю, никак не могу додуть, как мне сделать такую сортировку, чтобы сохранилась целостность полей.

Еще хочу добавить верхний уровень массива выглядит так:
Код:
[0] => Array (....)   [1] => Array (....)     [2] => Array (....)     [3] => Array (....)
Собственно вот эти элементы и нужно перемещать в самом массиве.


Привожу один елемент массива, таких елементов может быть тысячи:
Код:
[0] => Array ( 
[address] => ул. Советская, 158 кв. 130 
[aonline] => 1 
[cash] => 39.193548 
[credit] => 0 [creditexpire] => 0 
[currip] => 10.10.1.47 
[disableddetailstat] => 
[down] => 
[email] => 
[freemb] => 0 
[group] => Центр 
[ips] => 10.10.1.47 
[lastactivitytime] => 1299176513 
[lastcash] => -1.935484 
[lasttimecash] => 1299103200 
[login] => PETR 
[name] => Иванов Иван Иванович 
[note] => куплен 
[passive] => 
[password] => 777777777 
[phone] => 7-77-77 
[pingtime] => 0 
[result] => 1 
[status] => 1 
[tariff] => 1_Mbit
 
[traff] => Array ( 

[md] => Array ( 
[0] => 3394029143 
[1] => 0 
[2] => 0 
[3] => 0 
[4] => 0 
[5] => 0 
[6] => 0 
[7] => 0 
[8] => 0 
[9] => 0 ) 

[mu] => Array ( 
[0] => 110182937 
[1] => 0 
[2] => 0 
[3] => 0 
[4] => 0 
[5] => 0 
[6] => 0 
[7] => 0 
[8] => 0 
[9] => 0 ) 

[sd] => Array ( 
[0] => 20250997 
[1] => 0 
[2] => 0 
[3] => 0 
[4] => 0 
[5] => 0 
[6] => 0 
[7] => 0 
[8] => 0 
[9] => 0 ) 

[su] => Array ( 
[0] => 87158644 
[1] => 0 
[2] => 0 
[3] => 0 
[4] => 0 
[5] => 0 
[6] => 0 
[7] => 0 
[8] => 0 
[9] => 0 ) 

) 


[userdata] => Array ( 
[0] => 
[1] => 
[2] => 
[3] => 
[4] => 
[5] => 
[6] => 
[7] => 
[8] => 
[9] => )

 )

Последний раз редактировалось Небесный; 03.03.2011 в 22:44.
Небесный вне форума Ответить с цитированием
Старый 03.03.2011, 22:47   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Используйте БД, связанные таблицы для распределения информации.
Это решит ваши проблемы с сортировкой данных.
Andkorol вне форума Ответить с цитированием
Старый 03.03.2011, 22:50   #3
Небесный
Зелень
Форумчанин
 
Аватар для Небесный
 
Регистрация: 03.02.2007
Сообщений: 302
По умолчанию

Я знаю, что решило бы, нету возможности использовать СУБД, а сама БД находится в файлах.
Это и заполняется массив из файловой базы.
Небесный вне форума Ответить с цитированием
Старый 03.03.2011, 23:02   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Небесный Посмотреть сообщение
Я знаю, что решило бы, нету возможности использовать СУБД, а сама БД находится в файлах.
Ну так надо искать возможность использовать БД, писать скрипты и перегонять данные из файлов в БД.
Это ж изврат какой-то - такие объемы информации,столько разных уровней, сортировка по куче критериев - и на файлах....

Ну а по сабжу - по-любому нужно дробить информацию, выделять ключевые параметры(ID юзеров, например), затем делать отдельные файлы с отдельными видами информации(для каждого вида - отдельный файл), связанными друг с другом по этому ID.
Но это - фактически копировать алгоритмы БД, при таких существующих объёмах - тоже дело не быстрое....
Andkorol вне форума Ответить с цитированием
Старый 04.03.2011, 10:59   #5
Небесный
Зелень
Форумчанин
 
Аватар для Небесный
 
Регистрация: 03.02.2007
Сообщений: 302
По умолчанию

Кое-что нарыл!
Но, есть одно но.
Сам пример сортировки:
Код:
#!/usr/bin/php
<?php
    $ar1 = array(
        array('login' => 'seva', 'ip' => '192.168.1.3'),
        array('login' => 'genya', 'ip' => '192.168.1.35'),
        array('login' => 'luda', 'ip' => '192.168.1.9'),
        array('login' => 'masha', 'ip' => '192.168.1.1'),
        array('login' => 'petya', 'ip' => '192.168.1.4'),
    );

    foreach($ar1 as $key => $row)
        $ip[$key] = $row['ip'];

    array_multisort($ip, SORT_ASC, $ar1);

    print_r($ar1);
?>
И получаем в ответ такое:
Код:
root@ubuntu:/moy-katalog/php# ./1
Array
(
    [0] => Array
        (
            [login] => masha
            [ip] => 192.168.1.1
        )

    [1] => Array
        (
            [login] => seva
            [ip] => 192.168.1.3
        )

    [2] => Array
        (
            [login] => genya
            [ip] => 192.168.1.35
        )

    [3] => Array
        (
            [login] => petya
            [ip] => 192.168.1.4
        )

    [4] => Array
        (
            [login] => luda
            [ip] => 192.168.1.9
        )

)
Как видим по сортировке, идет
Цитата:
192.168.1.3
192.168.1.35
192.168.1.4
....
Ясно, что 192.168.1.35 > 192.168.1.4 .
Понятно, что оно посортировало по первой цыфре, так как 3 < 4
Переводить ip в 2-ную систему а потом обратно, опять затрата времени.

Кто что может посоветовать по этому поводу.
Небесный вне форума Ответить с цитированием
Старый 04.03.2011, 11:12   #6
mrgrudge
Форумчанин
 
Аватар для mrgrudge
 
Регистрация: 20.02.2010
Сообщений: 229
Сообщение

Цитата:
Сообщение от Небесный Посмотреть сообщение

array_multisort($ip, SORT_ASC, $ar1);
Понятно, что оно посортировало по первой цыфре, так как 3 < 4
Переводить ip в 2-ную систему а потом обратно, опять затрата времени.
как я понял он впринципе значения полей ip отсортировал в порядке возрастания(на что собственно и указывает SORT_ASC), если не нравитсья такая сортировка то используйте другие параметры SORT_STRING, SORT_NUMERIC, SORT_DESC. а так в цлеом идея не плохая)
думай как баг, действуй как баг, и ты найдешь баг )
mrgrudge вне форума Ответить с цитированием
Старый 04.03.2011, 11:42   #7
Небесный
Зелень
Форумчанин
 
Аватар для Небесный
 
Регистрация: 03.02.2007
Сообщений: 302
По умолчанию

С сортировкой ip прекрасно справляется
Код:
natsort($ip);
Но, как применить ее в многомерном массиве. (((

А, флаги для многомерной сортировке уже перебрал разные - пока ничего не подходит.
Код:
Флаги определения порядка сортировки:

    * SORT_ASC - сортировка в порядке возрастания (по умолчанию)
    * SORT_DESC - сортировка в порядке убывания 

Флаги типа сортировки:

    * SORT_REGULAR - сравнивать элементы как есть (по умолчанию)
    * SORT_NUMERIC - сравнивать элементы как числа
    * SORT_STRING - сравнивать элементы как строки
Небесный вне форума Ответить с цитированием
Старый 04.03.2011, 14:13   #8
Небесный
Зелень
Форумчанин
 
Аватар для Небесный
 
Регистрация: 03.02.2007
Сообщений: 302
По умолчанию

Нашел один способ все же.
Это функция ip2long

И того:
Код:
#!/usr/bin/php
<?php
    $ar1 = array(
        array('login' => 'seva', 'ip' => '192.168.1.3'),
        array('login' => 'genya', 'ip' => '192.168.1.35'),
        array('login' => 'luda', 'ip' => '192.168.1.9'),
        array('login' => 'masha', 'ip' => '192.168.1.1'),
        array('login' => 'petya', 'ip' => '192.168.1.4'),
    );


    foreach($ar1 as $key => $row)
        $ip[$key] = ip2long($row['ip']);


    array_multisort($ip, SORT_ASC, $ar1);

    print_r($ar1);
?>
На выходе имеем:
Код:
root@ubuntu:/moy-katalog/php# ./1
Array
(
    [0] => Array
        (
            [login] => masha
            [ip] => 192.168.1.1
        )

    [1] => Array
        (
            [login] => seva
            [ip] => 192.168.1.3
        )

    [2] => Array
        (
            [login] => petya
            [ip] => 192.168.1.4
        )

    [3] => Array
        (
            [login] => luda
            [ip] => 192.168.1.9
        )

    [4] => Array
        (
            [login] => genya
            [ip] => 192.168.1.35
        )

)
Небесный вне форума Ответить с цитированием
Старый 07.03.2011, 18:24   #9
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

Вы планируете проводить сортировку всего контента который находится на сайте по запросу юзверей? (еще интересней окажется если это ajax запрос )
мб стоит отсортировать один раз по всем столбцам и сохранить индексы в отдельном файле и при надобности доставать контент по этим индексам, а вставлять бинарными вставками ? Мне кажется так будет намного быстрее
ololo-schoolboy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива методами предсортировки и слияния, и пирамидальная сортировка. lenny_24 Помощь студентам 2 17.04.2011 18:57
Сортировка массива Neksion Помощь студентам 1 02.12.2010 16:46
Сортировка массива SGadX Помощь студентам 0 22.10.2010 12:56
Сортировка массива 8edrius Помощь студентам 0 08.05.2010 03:31
Сортировка массива Kraven Общие вопросы Delphi 3 25.06.2008 18:22