Díky za odvážný první příspěvek do nové sekce.
Největší slabinou tohoto řešení je struktura databáze. Ukládáním kategorií jako výrazů oddělených speciálním znakem se obíráte o všechny funkce relační databáze.
Na vašem místě bych databázi denormalizoval, tj. vytvořil strukturu naznačenou tady:
Kód:
CREATE TABLE product (
`productid` INT UNSIGNED NOT NULL,
...
)
CREATE TABLE category (
`categoryid` INT UNSIGNED NOT NULL,
...
)
CREATE TABLE product_category (
`productid` INT UNSIGNED NOT NULL,
`categoryid` INT UNSIGNED NOT NULL
)
Seznam kategorií, počet kategorií, počet výrobků v kategorii atd. pak dostanete triviálními SQL dotazy.
Kód:
SELECT * FROM category;
SELECT COUNT(*) AS categoryCount FROM category;
SELECT COUNT(*) AS productCount FROM product_category GROUP BY categoryid;
Předpokládejme ale, že z nějakého důvodu není možné jména normalizovat. Třeba počítáme frekvenci slov v textu.
Moje verze je tady:
Kód:
$queryResult = mysql_query("SELECT category FROM product order by category");
while ($row = mysql_fetch_assoc($queryResult)) {
$categories = explode(",", $row['category']);
foreach ($categories as $category) {
$normalizedName = normalizeName($category);
if( ! isset($frequencyTable[$normalizedName])) {
$frequencyTable[$normalizedName] = 1;
} else {
$frequencyTable[$normalizedName] += 1;
}
}
}
function normalizeName($name) {
$normalized = mb_strtolower($name);
$normalized = trim($normalized);
return $normalized;
}
Hlavní problém kódu jsou názvy proměnných.
Jednopísmenné proměnné nemají v kódu co dělat a navíc stejná proměnná má na různých místech odlišnou funkci ($v, $r).
Je zbytečné řadit v SQL dotazu kategorie podle abecedy. Řazení v tomto případě nehraje roli.
Blok po while() by měl být obalený složenými závorkami, ačkoliv má jen jeden řádek.
Když budeme frekvenci počítat už v cyklu, ve kterém procházíme řádky z DB, ušetříme jeden foreach() průchod.
V každém cyklu provádíte zbytečně náročnou operaci array_keys() a následně in_array(). Stačí se zeptat na existenci klíče.
Díky za kód a jsem zvědavý, co napadne ostatní.