Autor | Zpráva | ||
---|---|---|---|
Trojan Profil * |
#1 · Zasláno: 4. 5. 2012, 20:47:37
Chci se vás zeptat jaký způsob je nejrychlejší když chci provést dva druhy akcí.
Ze stringu $bfn (zkratka basic filename) chci dostat jeden až tři řetězce. Kolik jich je záleží na tom jestli tam jsou jedny nebo dvoje závorky: 1.a) žádné kulaté závorky: $bfn se nebude měnit 1.b) jedny kulaté závorky: to co je před závorkama se bude jmenovat $bfn; to co je v závorkách se jmenuje $okres. 1.c) dvoje kulaté závorky: to co je před závorkama se bude jmenovat $bfn; to co je v prvních závorkách se jmenuje $note. To co je v druhých závorkách se jmenuje $okres. // $bfn = "jedna (buf) (Praha)"; // $bfn = "dva (Praha)"; $bfn = "tri (buf!) (Praha)"; $note = explode('(', $bfn); // separate $bfn_okr or $bfn_note from paranthesis if ( count($note)==2 ) { $okres = $note[1]; $note = 1; } elseif ( count($note)==3 ) { $okres = $note[1]; $note=$note[2]; $okres = str_replace(')','',$okres); $note = str_replace(')','',$note); } else $note = false; if ( $note ) { $bfn = explode('(', $bfn); $bfn=$bfn[0];} // Don't use paranthesis in $bfn anymore Takže by mě zajímal váš názor jestli to nedělám moc složitě. A druhá situace (2), když chci odstranit vše, kromě toho co je před první závorkou (, tak mám to dělat podobným stylem pomocí 1. explode 2. přiradit první prvek z výsledku 3. zase explode 4. zase přiřadit první prvek z výsledku Nebo bych měl volit preg_replace, což je sice jen jeden příkaz, ale zase je to funkce, která zřejmě bude trvat déle. Čili jak vidíte poměr užitečnosti toho řešení (2) přes explode k řešení přes preg_replace? |
||
Majkl578 Profil |
#2 · Zasláno: 4. 5. 2012, 21:55:41
Trojan:
„Chci se vás zeptat jaký způsob je nejrychlejší když chci provést dva druhy akcí.“ Toto je pro tvé účely naprosto irelevantní informace, jelikož se jedná o velmi krátký řetězec. „Nebo bych měl volit preg_replace“ Ne replace, ale match. Vytáhneš si jednotlivé části (pokud existují), například takto: $string = 'tri (buf!) (Praha)'; preg_match('~^(?<bfn>.+)(?: \((?<okres>[^)]+)\))?(?: \((?<note>[^)]+)\))?$~U', $string, $m); echo 'bfn: ', $m['bfn'], PHP_EOL; if (!empty($m['okres'])) echo 'okres: ', $m['okres'], PHP_EOL; if (!empty($m['note'])) echo 'note: ', $m['note'], PHP_EOL; |
||
Borius Profil |
Trojan:
„Takže by mě zajímal váš názor jestli to nedělám moc složitě.“ Dal bych přednost regulárnímu výrazu: preg_match('/^(?P<bfn>\w+)(?:\((?P<okres>\w+)\))?(?:\((?P<note>\w+)\))?$/U', $bfn, $matches); Pozdě… |
||
Alphard Profil |
#4 · Zasláno: 4. 5. 2012, 22:09:35
|
||
Tori Profil |
#5 · Zasláno: 4. 5. 2012, 22:23:51
Trojan:
Pokud byste trval na rozebrání pomocí explode, dá se to říct i stručněji: $string = "tri (buf!) (Praha)"; $tmp = explode('(', $string); $bfn = array_shift($tmp); $okres = !empty($tmp) ? trim(array_pop($tmp), ' ()') : ''; $note = isset($tmp[0]) ? trim($tmp[0], ' ()') : ''; |
||
Trojan Profil * |
#6 · Zasláno: 4. 5. 2012, 22:57:29
Jedná se o to, že procházím velké množství souborů (názvů souborů - asi pět tisíc nebo ještě víc), takže jsem to chtěl udělat co nejefektivněji. Vzhledem k tomu, že dále se ještě provádí výpočty. Takže myslím, že explode je efektivnější než preg funkce. Ale dokázané to nemám.
Alphard, to bych snad mohl použít. Dík. Tori. Díky, vyzkouším. |
||
Nox Profil |
#7 · Zasláno: 4. 5. 2012, 23:16:11
Trojan:
"myslím" zde nemusí být vždy platné ... slyšel jsem i o případech, kdy byl preg rychlejší jak normální řetězcová funkce. Pokud jde o výkon, tak si to nejlíp musí člověk testnout. Dál je otázka, co v celém programu bude bottleneck, spíš bych to viděl na práci disku (ale to je také "myslím"...) |
||
Časová prodleva: 12 let
|
0