PHP 5 для начинающих |
Страница 559 из 813 измененное имя) и в реальный массив имен исполнителей (записываются исходные имена). Если имя записано в тестовом массиве, то нет необходимости добавлять его снова. Теперь следует поместить каждую песню в один массив. Необходимо создать массив, упорядоченный по уникальным именам исполнителей, поэтому есть смысл создать ассоциативный массив, в котором ключами будут имена исполнителей. Так как каждому исполнителю, скорее всего, принадлежит несколько песен, значением каждого элемента массива будет другой одномерный массив, в котором каждый элемент будет представлять одну песню. Поскольку желательно хранить как фактическое название каждой песни, так и имя соответствующего файла, следует представить каждый элемент этого массива тоже в виде массива. Получающаяся в результате структура данных весьма сложна (при желании ее можно просмотреть с помощью функции var_dump() ), но она идеально подходит для создания XML-кода и действительно очень упрощает код сценария radiorequest.php. Имена всех исполнителей в только что созданном массиве обрабатываются с помощью следующего цикла: $arTracks = Array(); $arAlreadyAccountedForSongIndices = Array(); for ($i=0; $i<=sizeof($arArtists)-1; $i++) { $strArtistName = $arArtists[$i]; $strTestArtistName = $arTestArtists[$i]; $arTracks[$strArtistName] = Array(); for ($j=0; $j<=sizeof($arMP3Files)-1; $j++) { if (in_array($j, $arAlreadyAccountedForSongIndices) == false) { $strPath = $arMP3Files[$j]; $intResult = $objMP3ID->read ($strPath); $strThisArtist = $objMP3ID->getTag ("artists", "Unknown Artist"); $strThisTestArtist = strtoupper(preg_replace("/[^A-Za-z0-9]/", "", $strThisArtist)); if ($strThisTestArtist == $strTestArtistName) { array_push($arAlreadyAccountedForSongIndices, $j); $arSongHash["TITLE"] = $objMP3ID->getTag ("name", "Unknown Title"); $strSongFilename = str_replace("$strMyMP3Directory" . "/", "", $arMP3Files[$j]); $arSongHash["LINK"] = "radiorequest.php?requestfile=" . urlencode($strSongFilename); array_push($arTracks[$strArtistName], $arSongHash); }; }; }; }; По сути, в цикле обрабатывается список исполнителей (реальный список, а не тестовый), а в массиве создается ключ на основе имен исполнителей. Затем для каждого ключа просматривается весь список МРЗ-файлов и проверяется, принадлежит ли каждая композиция данному исполнителю. Имя исполнителя, хранящееся под соответствующим индексом в тестовом массиве, сверяется с именем исполнителя в МРЗ-файле, которое предварительно обрабатывается регулярным выражением. Это, как уже было сказано, позволяет игнорировать различия в количестве пробелов, знаков препинания и регистре символов. Чтобы определить, какие песни принадлежат тому или иному исполнителю, всю коллекцию приходится просматривать в цикле. Вследствие этого рассматриваемый сценарий может потреблять значительные ресурсы и работать медленно. Поэтому для повышения производительности необходимо связать каждый индекс массива МРЗ-файлов ($arMP3Files) с исполнителем только один раз— композиция, для которой |