Массив сравните, пока циклы и эффективность - PullRequest
2 голосов
/ 28 февраля 2012

Я создаю простой альбом и отслеживаю веб-приложение, но я вхожу в серьезную ситуацию с извлечением правильной информации и повышением ее эффективности.У меня есть два стола - в альбоме около 500 наименований и около 5000 треков.

Итак, я начну с обычного цикла while:

$albumQuery = "SELECT * FROM `album` ORDER BY album ASC";
$albumDatabase = mysql_query($albumQuery, $admin) or die(mysql_error()); 

while($albumRow = mysql_fetch_array($albumDatabase)){
    $list = "";
    $list.="build some html for showing later";

- вот где я попадаюпроблема эффективности:

    $trackQuery = "SELECT track, album FROM `track` WHERE album = '{$album}' ORDER BY filename ASC";
    $trackDatabase = mysql_query($trackQuery, $admin) or die(mysql_error());

    while($trackRow = mysql_fetch_array($trackDatabase)){
        $list.="track html info";
    }

    $listarray[] = $list;
}

natcasesort($listarray);

Затем я запускаю foreach позже в теле

foreach ($listarray as $v){
    $first_letter = strtoupper(mb_substr($v,9,1));
    if($tmp!==$first_letter){
        $tmp = $first_letter;
        echo '<div class="alphaHolder">'.$tmp.'</div>';
    }
    echo $v;
}

Это работает отлично, за исключением, вероятно, массовой неэффективности.

Iможно заставить его регургитировать всю информацию в правильном порядке и порядке.

В качестве эксперимента я поместил второй цикл while вне родительского цикла и вставил эту информацию в свой собственный массив.Затем запустил это:

foreach($trackArray as $k => $v){
    if(in_array($v['album'], $albumRow)){
        $list.="track html info";
    }
}

Но потом я понял, что каждый раз, когда он проходит через родительский цикл, он перезапускает foreach для 5000 элементов, а затем выполняет in_array 500 раз.Это, очевидно, занимает много времени и обычно вылетает из браузера.Приводит меня к тому, что исходный вложенный цикл while немного более эффективен и запутан.

Я начал думать, что array_intersect может быть решением, но я не хочу расшатывать неправильное дерево.

Вероятно, слишком много циклов и что вы делаете, но мне нужна естественная сортировка и регургитация буквенно-цифрового заголовка.

Screenie: http://ink361.com/#/photos/133115598501394804_9688917

Ответы [ 3 ]

1 голос
/ 28 февраля 2012

Как и во многих других вопросах, никакой прямой подход не может помочь.
HTML-страница состоит из 5500 строк ВСЕГДА будет неэффективной и медленной. Невероятно неэффективно и резко медленно.

Итак, вам нужен не какой-то хитрый алгоритм, а совершенно другая архитектура.

Нумерация страниц - это то, что вам нужно.

Разделите ваш список на страницы.

1 голос
/ 28 февраля 2012

Я думаю, вам следует переосмыслить запрос "track". Вы можете ПРИСОЕДИНИТЬСЯ к таблице «альбомов», чтобы добавить каждую строку альбома к каждой строке дорожек и сделать только один цикл над результирующим массивом, чтобы получить необходимый результат.

В любом случае, вы можете просто сделать все вещи foreach ($listarray as $v){ прямо перед $listarray[] = $list;.

И, почему вы используете сортировку с PHP, если вы уже сделали это, с SQL. Тебе это действительно нужно? Кроме того, вам действительно нужно, чтобы все эти 5000 предметов были доступны одновременно? Не каждый хотел бы, чтобы эта сортировка была сделана, моя кошка хотела бы, чтобы она сортировалась по длине песни или жанру, вы достаточно задумывались об этом?

Для более эффективной работы с эффективностью хорошо, если доступны образцы данных вместе с автономно работающим «кодом дела». Ваш код кажется сломанным в данный момент. Возможно, вам стоит поработать над вашими практиками php-кодирования.

0 голосов
/ 28 февраля 2012

Вы можете сначала перевернуть массив , позже проверить, существует ли ключ.Это будет намного быстрее, поскольку его индексированный поиск будет отличаться от предыдущего итеративного поиска.

$flipped_$albumRow = array_flip($albumRow);
foreach($trackArray as $k => $v){
    if(isset($flipped_albumRow[$v['album']]))){ # <- line of interest.
        $list.="track html info";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...