PHP: Setřídění pole podle abecedy včetně diakritiky

PHP nabízí vskutku rozsáhlé možnosti pro práci s poli a to včetně třídění. Problém ovšem nastává, pokud je potřeba setřídit prvky pole, jejichž počáteční písmena neobsahují pouze znaky anglické abecedy, ale také další písmena s diakritikou, či jiné symboly. V takovém případě jsou tyto položky umístěny na začátek, či konec pole (záleží na nastavení serveru), kam přitom nemusí vůbec patřit. Tento problém je sice možné obejít setříděním prvků při výběru z databáze, někdy ale stejně může nastat situace, kdy je nutné seřadit až samotné pole.

Sám jsem na tuto situaci narazil, a proto jsem se rozhodl, že se pokusím napsat vlastní třídící funkci, která bude prvky polí řadit korektně.

Je využito funkce usort(), která umožňuje pro třídění definovat vlastní funkci, ve které dochází k porovnávání jednotlivých prvků mezi sebou na základě vlastních kritérií. K tomu, aby byly jednotlivé položky pole správně řazeny, bylo nutné před samotným porovnáváním jednotlivých dvojic, převést speciální znaky na znaky anglické abecedy. Toto bohužel vyžaduje mít seznam všech speciálních znaků s překlady na znaky standardní.

PHP: Oprava špatné detekce kódování v DOMXpath

DOMXpath je skvělý nástroj pro zpracování XML a HTML souborů. Umožňuje dle speciální syntaxe vypsat pouze požadované části souboru dle specifických tagů, identifikátorů, tříd nebo obsahu elementů.

Obsahuje však bug, díky kterému není korektně rozpoznáno UTF8 kódování zdrojového souboru. Výsledkem je pak špatná reprezentace diakritiky.

Tento problém je však možné celkem snadno obejít. Místo metody loadHTMLfile je nutné použít loadHTML. Požadovaný soubor je nutné předem načíst a provést úpravu hlavičky.

<?php
$file = file_get_contents('http://www.example.com');
$file = preg_replace('/<head[^>]*>/','<head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">',$file);

$doc = new DOMDocument();
$doc->loadHTML($file);
?>
Syndikovat obsah