Archív

Příspěvek oštítkován ‘PHP’

Synchronizace pomocí polí v PHP

31.03.2008 Bez komentářů

V tomto zápisku bych rád popsal řešení poměrně časté situace, se kterou se setkáváme v administračních či podobných systémech.

Často je potřeba vyřešit přiřazování položek nějaké skupině (např. zařazování a odebírání uživatelů do pracovních skupin). S tím vyvstává problém synchronizace existující množiny vůči nové množině ID, konkrétně je potřeba přidat do databáze všechna ID nově vybraných uživatelů, zrušit všechna ID odebraných uživatelů a stejné záznamy ponechat beze změny.

Když tento problém zjednodušíme na pole, je vše překvapivě jednoduché, klíčem je použití funkce array_diff():

// pole puvodnich zaznamu v databazi
$original = array(1, 2, 4, 5);
// pole s novym uzivatelskym vstupem
$new = array(1, 3, 5);
// nove pridane polozky (3)
$added = array_diff($new, $original);
// odebrane polozky (2, 4)
$removed = array_diff($original, $new);

Pokud k této práci s poli dopíšeme vrstvu s SQL dotazy (SELECT pro $original, INSERT pro $added a DELETE pro $removed) je vše vyřešeno.

Categories: PHP Tags:

Ztracený text a pomlčka z Wordu

11.03.2008 Bez komentářů

Při práci na jednom projektu jsem narazil na zajímavý problém – občas se se záhadně ztrácely kusy textů v odeslaném emailu a některých výpisech. Chvíli jsem pátral v kódu, až se mi podařilo najít příčinu, která mi přijde natolik zajímavá, abych ji zde zmínil.

Za všechno může funkce iconv() (na PHP 5.2.1), použitá při konverzi z kódování UTF-8 do ISO-8859–2 a pomlčka, kterou ráda produkuje aplikace Microsoft Word, konkrétně se jedná o znak neboli chr(150).

Pokud tento znak proženeme funkcí iconv(), funkce jej přeskočí, neboť pro něj nezná ekvivalent, a rovněž zahodí vše co je za ním.

Výsledkem následujícího kódu bude tedy pouze text „jedna“:

<?php echo iconv('utf-8', 'iso-8859-2', 'jedna–dve'); ?>

Řešení je prosté, např. stačí jednoduše při ošetřování uživatelského vstupu nahradit znak chr(150) za běžný znak minus, tedy chr(45).

<?php $text = str_replace('–', '-', $text); ?>

Jelikož někteří uživatelé webových aplikací používají Word pro přípravu textů docela často, je vhodné na tuto vlastnost při používání funkce iconv() pamatovat.

Categories: PHP Tags: