Autor Zpráva
Exkalibr
Profil *
Mám takovýto kód

       $emails = file("adresy.txt");
       for ( $i=0; $i<count($emails) ; $i++ )
          $emails[$i] = strtolower(trim($emails[$i]));
       $portions = array();
       for ( $i=0; $i<count($emails) ; $i++ ):
         $sub = substr($emails[$i],0,2);
         if ( strlen($sub)<2 )
           $sub .= " ";
         if ( !array_key_exists( $sub, $portions) ) 
           $portions[$sub] = array();
         array_push ( $portions[$sub], $emails[$i]);
       endfor;
       print_r($portions);die;

Prosím jednak o zhodnocení, tí části kde vytvářím nové pod-pole
$portions[$sub] = array();
Jestli ten test není příliš neefektivní. Nejde to udělat nějak rychleji a "násilně"?

Testuju tenhle kód na nějakých 425 em. adresách a cílem je roztřídit je do skupin
např:
[ma] = array(
martinek@seznam.cz,
martina@seznam.cz,
martinková@seznam.cz)
[du] = array(
durkac@seznam.cz,
durek@centrum.cz,
dundy@gmail.com)

A potřebuju jednak seřadit ty elementy uvnitř druhé úrovně, ale i uvnitř první úrovně.


Ještě přidám dotaz, jestli v PHP není funkce, která by dokázala vrátit součet délek všech řetězců v poli, aniž bych vytvářel smyčku.
RastyAmateur
Profil
Exkalibr:
Joker v jiném vlákně žádal, abychom se tu navzájem neuráželi, tak ti alespoň pro tentokrát zkusím seriózně pomoci. Raději i pominu tvůj stylopis a budu dělat, že je to dobře čitelné.

- Používáš dvakrát konstrukci for ( $i=0; $i<count($emails) ; $i++ ). Tím ovšem vyvoláš funkci count($emails) v každém průběhu cyklem. Hádám, že se v průběhu to pole nemění, takže je to hodně zbytečné.

- Šlo by to celé zkrátit do 1 cyklu

- Místo array_key_exists() lze použít isset(), což je téměř dvakrát rychlejší.

- Místo array_push lze použít $array[], což je více jak 3x rychlejší (což se btw píše i v manuálu)

- Volání strtolower(trim($emails[$i])) by mělo proběhnout již při zapisování do toho souboru, pokud nemáš nějaký akutní důvod proč to nedělat.

- if ( strlen($sub)<2 ) - co tím jako ošetřuješ? Že ta emailová adresa má alespoň dva znaky? Nebo snad v souboru adresy.txt nemáš jen emailové adresy, i když podle toho vypadá i ten kód? Nevím, co je horší.

- Raději se neptám na důvod, proč potřebuješ takto třídit emailové adresy...

Nějak nevím, co na to říci. Jako samozřejmě neznám veškeré okolnosti, co vlastně děláš, proč to děláš a jestli by to nešlo už dříve udělat nějak jinak, ale když vidím tvou ukázku 13 řádků, já bych z toho minimálně 7 kompletně změnil. Což by bylo u nějakého začátečníčka, co se učí, vlastně úplně v pohodě, ale zrovna u tebe? Vystupuješ tady jako někdo, kdo ví o nízkoúrovňovém programování tolik, že databáze ho zdržují. Tvojí reakci na Keeehiho odpověď jsem si v práci vytiskl a nalepil nad monitor. Řešíš to, že objekty jsou pomalé, furt debatuješ o rychlém kódu a pak předvedeš tohle? Kolikrát jsem si říkal, že sice nechápu tvé uvažování, ale že o tom asi vážně něco víš, když řešíš věci jako jsou zamykání souborů nebo posouvání čísel a fakt, že to děláš v PHP bude asi také nějak vynucený, že to asi nebude úplně tvoje svobodná volba. Ale tímhle jsi mě kompletně dostal. Prosím, vykašli se na to a začni psát normální a čitelný kód, co funguje. Pak ti tady na té diskusi i možná někdo pomůže...
Exkalibr
Profil *
Díky za odpověď i trpělivost.
První smyčka je jen provizórní pro otestování algoritmu funkce, který tvořím. Soubor s adresama je jen dočasný a není získaný vyplňováním formulářů, prostě jsem vyexportoval nasbírané kontakty v emailovém klientu.

Emailové adresy zadané přes formulář ořezávám tak, že odstraňuju @seznam.cz, @centrum.cz apod a nahrazuji je za číslo. Hypoteticky tak může existovat anpříklad adresa a1, a0 apod. ale neuvědomil jsem si, že v takovém případě jde o strlen($sub)<3. To co dělám, že sbírám první dvě písmena emailových adres a vytvářím z toho rejstříky, pro rychlejší vyhledání emailové adresy v souboru txt.


K péhápéčku jsem se dostal teprve minulý týden v pondělí, jinak až před deseti lety, ale z té doby si už moc nepamatuji. na [] jsem už od té doby zapoměl.


zapomněl. Doteď mám ale v živé paměti kolik času jsem v minulosti strávil s OOP a bylo to vše k ničemu, protože OOP je dost nepřehledné a člověk jak zapomene co v tom kódu je, pak se k tomu už nedokáže vrátit.
Keeehi
Profil
Exkalibr:
Ne že bych ti chtěl házet do té tvé optimalizace vidle, ale jsi si vědom toho, že emailové adresy můžou končit číslicí. Tudíž to bude fungovat jen v případě, že ta připojená část bude mít fixní délku. A jelikož budeš mít asi více jak 10 domén, tak bys měl začít 00, 01, 02 případně delší sufix.
Exkalibr
Profil *
Keeehi:
Počítám jen s rozsahem od 0-1, týká se to jen těch nejfrektovanějších. S číslicí na konci jsem nepočítal, takovou doménu 1. úrovně jsem ještě neviděl.
Keeehi
Profil
Exkalibr:
Samozřejmě jsem myslel uživatelovo jméno v emailové adrese.
Kapitán
Profil *
Exkalibr:
Emailové schránky nemusí být pouze na profláklé doméně gmail seznam atd. Můžeš mít doménu, která je dokonce jenom z čísel. Dost často to jsou jen tři čísla ale může jich být i víc. Zrovna nedávno jsem viděl stránku, která měla v doméně telefonní číslo. Jsou to extrémy, ale je dobré zvážit, zda se ti tam někdo podobný náhodou nemůže taky přimotat.

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