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(); 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 |
#2 · Zasláno: 18. 10. 2019, 18:10:41
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 |
#4 · Zasláno: 18. 10. 2019, 19:53:11
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 * |
#5 · Zasláno: 18. 10. 2019, 22:48:47
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 |
#6 · Zasláno: 19. 10. 2019, 00:33:18
Exkalibr:
Samozřejmě jsem myslel uživatelovo jméno v emailové adrese. |
||
Časová prodleva: 5 dní
|
|||
Kapitán Profil * |
#7 · Zasláno: 24. 10. 2019, 00:51:17
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. |
||
Časová prodleva: 5 let
|
0