Autor Zpráva
jendak
Profil *
Ahoj,
mám vícerozměrné pole a potřebuji zjistit, jestli v něm není alespoň jedna hodnota prázdná.
$pole["uzivatel1"]["jmeno"] = "Jan";
$pole["uzivatel1"]["prijmeni"] = "Novák";
$pole["uzivatel2"]["jmeno"] = "Martin";
$pole["uzivatel2"]["prijmeni"] = "";

V tomto případě by se splnila podmínka, a vyhodilo to chybu. Kdyby uzivatel2 vyplnil i přijmení, žádný problém by nenastal. (Počet uživatelů je variabilní)
Díky moc
Joker
Profil
jendak:
Na první úrovni cyklus (foreach) a na druhé otestování všech povinných položek.

Základní verze by mohla být:
$kontrola = true;
foreach ($pole as $uzivatel) {
  if (empty($uzivatel["jmeno"]) || empty($uzivatel["prijmeni"]) 
    $kontrola = false;
}

Kdyby uživatelů bylo fakt hodně, nebo se dělala nějaká složitější kontrola, prostě kdyby byl nějaký výkonový problém s tím, že kód výše projede pokaždé všechny uživatele, šlo by to optimalizovat nějak takhle:
$kontrola = true;
while ($kontrola && (list(,$uzivatel) = each($pole))) {
  $kontrola = !(empty($uzivatel["jmeno"]) || empty($uzivatel["prijmeni"]));
}
Tohle skončí po první chybě.
Tori
Profil
array_search, i s třetím parametrem true
Joker
Profil
Tori:
To asi s víceúrovňovým polem nebude fungovat, nebo bude?
Tori
Profil
Joker:
Pardon, přehlédla jsem, že je to více uživatelů. Muselo by to tedy být v cyklu a pak bych se asi rozhodovala podle počtu ověřovaných položek, jestli použiju několikrát empty nebo array_search/in_array (kvůli čitelnosti).

Anebo je možné si dopsat funkci:
function in_array_recursive($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (is_array($item)) $result = in_array_recursive($needle, $item, $strict);
        else $result = ($strict ? $needle === $item : $needle == $item);
        if ($result) return true;
    }
    return false;
}
jendak
Profil *
Super, ste skvělí. Díky vám oběma.
Ještě jsem si uvědomil, že by bylo fajn. Uložit do dalšího pole, u jakého uživatele a u jaké položky nastala/y chyba/y.
Tori
Profil
jendak:
Podobným způsobem si můžete udělat i rekurzivní verzi array_search, která vrací klíč nalezené hodnoty.
jendak
Profil *
Tori:
Netuším moc, jak bych to provedl... Prosím mohla by jste mi to ukázat? Děkuji
Tori
Profil
jendak:
Řádek 2 změníte na foreach ($haystack as $key => $item) {, na řádku 5 testujte if ($result !== false) (protože se vám z rekurze může vrátit i číslo 0), a za tím si nastavíte, co chcete vracet. V proměnné $result bude klíč z vnořeného pole, v proměnné $key klíč tohoto prvku (tedy nadřazeného), spojte si je tam jak potřebujete.

Z pohledu uživatele to ale má nevýhodu, že se hledání zastaví na první prázdné položce, takže když uživatel nevyplní víc políček, upozorníte ho jen na jednu z chyb.
jendak
Profil *
Díky moc, hotovo :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0