Autor Zpráva
cony
Profil *
Ahoj,
mám 10 textových polí a chtěl bych nějákým jednoduchým způsobem zjistit, zda je v každém z nich jiný obsah. Napadlo mě porovnat 1. s 2., 3., 4. az 10., pak zas 2. s 3., 4., atd, ale příjde mi to strašně složité. Existuje nějáký jednoduchý způsob jak to ověřit?

Předem děkuji.
pcmanik
Profil
cony:
for ($i=0; $i<10; $i++) {
    for($x=$i; $x<10; $x++) {
       if ($premenna[i] == $premenna[x]) die('Zhodne texty.');
    }
}

Skript si už môžeš upraviť podľa svojich predstáv.
Edit: Ako vidím navrhol som tu najkomplikovanejšie riešenie.
Tori
Profil
cony:
Na zjištění, jestli se hodnota opakuje, se dá použít např. if (max(array_count_values($pole)) > 1) echo 'opakuje se'; anebo třeba if (count($pole) !== count(array_flip($pole))) { }. Jestli chcete jen vyhodit duplicity bez nějakých hlášek uživateli, stačí třeba $novePole = array_unique($pole); anebo pokud to jde do databáze, tak unikátní klíč na tom sloupečku v DB (ale tam se to pak porovná i se všemi dříve uloženými záznamy). Projděte si funkce pro práci s poli, třeba najdete něco lepšího/vhodnějšího.
DJ Miky
Profil
Můžeš je dát do pole, použít array_unique() a pokud bude mít výsledné pole stejně prvků, pak jsou prvky unikátní. Array_unique provádí v podstatě to samé, porovná každý s každým, takže pro opravdu dlouhé texty, které se liší minimálně, to nemusí být úplně nejrychlejší.
$texty = array('text1', 'text2', '...');

if(count($texty) == count(array_unique($texty))) {
    // každý text je jiný
}
else {
    // některé texty jsou stejné
}
preca1
Profil
Zdravim,
iteruj přes tyto pole a porovnej hodnotu pole s hodnotou následujícího pole (i + 1). Ulož si výsledek do jinýho pole a nakonec by ti měly v tomto poli zbýt samý false (že se hodnoty nerovnaj).
Netuším, jestli je moje řešení efektivnější, než ostatní řešení, ale můžeš to vyzkoušet a pak to sem třeba napsat.

e: Dík za upozornění, několikrát sem ten příspěvek upravoval, takže sem to poplet. Teď to neni tak dokonalý, ale na zjištění duplicit by to mělo stačit
pcmanik
Profil
preca1:
Tvoje riešenie nebude fungovať, nakoľko by tým prešiel len 1 krát celé pole, ale čo ak by sa rovnala povedzme 1. hodnota s 5.? K tomuto overeniu nikdy nepríde, nakoľko len porovnávaš s nasledujúcou.
A naviac má len jedno pole.
Tori
Profil
Přibližné porovnání: zdroj = pole s 26 odstavci lorem ipsum, co odstavec to prvek pole, z 26 bylo 8 duplicit. 1000 iterací:

$out = array_unique($pole); // 33ms
$out = array_flip(array_flip($pole)); // 63ms, klíče nejsou číslované po sobě
$out = array_keys(array_count_values($pole)); // 78ms
(neřeším zatížení systému ani parametry notebooku, předpokládám - možná mylně -, že jinde budou výsledky poměrně obdobné)
cony
Profil *
Super, děkuji použití array_unique() mi připadne nejlepší.
Keeehi
Profil
$stejne = false;
$pocet = count($pole);
for( $i = 0; $i < $pocet - 1 ; ++$i ) {
    for( $j = $i+1; $j < $pocet ; ++$j ) {
        if ( strcmp($pole[$i], $pole[$j]) !== 0 ) {
            $stejne = true;
            break 2;
        }
    }
}

if( $stejne ) {
    // vyskytují se duplicity
} else {
    // texty jsou unikátní
}
Dle mých testů je můj script 20x - 40x rychlejší, než ty, co testovala Tori. Testoval jsem to na podle mě nejhorším případu, který by mohl pro můj algoritmus nastat, tj. texty jsou unikátní ale liší se od sebe navzájem jen v posledním znaku. Rozdíl si vysvětluji tím, že všechny ty funkce vracejí a upravují pole, kdežto můj kód se ničím takovým zabývat nemusí. Ten jen porovnává. V extrémním případě, pokud by byly duplicitní první dva prvky pole, na počtu prvků v poli by nezáleželo.
Alphard
Profil
Teoreticky by pro dlouhé hodnoty mohlo být rychlejší vytvořit druhé pole, které bude ukládat pouze hashe původních hodnot a s tím pracovat.

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: