Autor Zpráva
Trojan
Profil *
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
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
Trojan:
A druhá situace (2), když chci odstranit vše, kromě toho co je před první závorkou (
Takové „víc klasické C podobné“ řešení je strpos() + substr(), nebo zase reguláry.
Tori
Profil
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 *
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
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"...)

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: