HayDee Posted January 17, 2010 Report Share Posted January 17, 2010 (edited) Sveicināti Rakstu nelielu directory list skriptu un aizķēros pie vienas lietas ar kuru nekādi netieku skaidrībā. Varbūt, ja izgulētos, ar svaigu aci būtu vieglāk.. :) Lieta tāda, ka vajag no šādas virknes /mape1/apaksmape1/vel_viena_mape/ nodzēst to pēdējo daļu "vel_viena_mape/". It kā algoritms galvā ir: No beigām saskaitīt, cik simboli ir sākot no otrās slīpsvītras (/mape1/apaksmape1/vel_viena_mape/) un tad atgriest visus simbolus no /mape1/apaksmape1/vel_viena_mape/, izņemot pēdējos ko saskaitiju. Kaut kā nemāku pareizi pielietot php fcijas, lai to dabūtu gatavu. Varbūt kāds varētu palīdzēt lūdzu? Centos saprotami paskaidrot.. Edited January 17, 2010 by HayDee Quote Link to comment Share on other sites More sharing options...
briedis Posted January 17, 2010 Report Share Posted January 17, 2010 Piedāvāju divus variantus :) <? $path = "/mape1/apaksmape1/vel_viena_mape/"; //Viens variants $tmp_p = substr($path,0,strlen($path)-1); //noņemam pēdējo slešu $str = substr($tmp_p,0,strrpos($tmp_p,"/")) . "/"; //Otrs variants $arr = explode("/",$path); array_pop($arr); array_pop($arr); $str = implode("/",$arr) . "/"; ?> Otrais tāds nesmuks :p Iesaku pirmo... Pareizi izpildīsies, ja būs attiecīgās prasības, tas ir, ceļš vienmēr būs ar "/" beigās un eksistēs direktorija "uz augšu"... Quote Link to comment Share on other sites More sharing options...
Java Posted January 17, 2010 Report Share Posted January 17, 2010 <?php $string = "/mape1/apaksmape1/vel_viena_mape/"; // seit ieliec `string` mainigo, kas bus tavs separators $dirSep = "/"; $array = explode($dirSep, $string); if (count($array) > 0) { $cleanedArray = array(); foreach ($array as $key=>$value) { if ($value != "") { $cleanedArray[] = $value; } } $reversedArray = array_reverse($cleanedArray); $newArray = array(); for ($i=1; $i<count($reversedArray); $i++) { $newArray[] = $reversedArray[$i]; } $newArrayReverse = array_reverse($newArray); $newString = $dirSep . implode($dirSep, $newArrayReverse) . $dirSep; echo $newString; } Quote Link to comment Share on other sites More sharing options...
HayDee Posted January 17, 2010 Author Report Share Posted January 17, 2010 Mja, liels paldies :) Tā ir ka neizgulējies mēģina skriptus rakstīt. Quote Link to comment Share on other sites More sharing options...
Java Posted January 17, 2010 Report Share Posted January 17, 2010 Pāris piebildes - lai arī mans skripts vismaz daļēji "attīra" direktoriju ceļa virkni no liekiem elementiem, tas ne tuvu neveic visu nepieciešamo validāciju. Es ieteiktu rakstīt atsevišķu funkciju direktoriju ceļa validācijai un tikai tad, ja direktorija ceļa virkne (mainīgais, kur glabājas direktorija ceļš), apstrādāt to tālāk vai pārtraukt skriptu, atkarībā no vajadzības. Ja ir notikusi iepriekš validācija, manis uzrakstītajam vienkāršajam algoritmam vari izņemt darbības ar "$cleanedArray" un pašu to mainīgo arī ārā un šo rindiņu: $reversedArray = array_reverse($cleanedArray); aizstāt ar šo: $reversedArray = array_reverse($array); Quote Link to comment Share on other sites More sharing options...
2easy Posted January 17, 2010 Report Share Posted January 17, 2010 (edited) Java, varbūt vēl pa 100 rindiņām izstiepsi to kodu? echo preg_replace('/[a-z0-9-_]+\/$/i', '', '/mape1/apaksmape1/vel_viena_mape/'); // /mape1/apaksmape1/ Edited January 17, 2010 by 2easy Quote Link to comment Share on other sites More sharing options...
Java Posted January 18, 2010 Report Share Posted January 18, 2010 Java, varbūt vēl pa 100 rindiņām izstiepsi to kodu? echo preg_replace('/[a-z0-9-_]+\/$/i', '', '/mape1/apaksmape1/vel_viena_mape/'); // /mape1/apaksmape1/ Tavs piedāvājums risinājums ir labs, bet tikau uz tīru direktorijas ceļa virkni ar "/" beigās. Manējais to vēl nedaudz "patīra". Bet ideja tāda, ka var izmantot "regexp" ir laba, piekrītu, ka varbūt pat šāds risinājums ir labāks. Kas attiecas uz rindiņu skaitu, tad tava viena rindiņa ir mazāk nekā par 30% ātrāka nekā manas 12 rindiņas (skaitot tikai tās, kur tiek izpildīta kāda funkcija vai notiek kāda piešķiršanas darbība, bet neskaitot "language constructs"). Protams, tavs risinājums "tīrai virknei" tik un tā ir labāks, taču atzīme bija par "rindiņu skaitu". Svarīgāks ir nevis rindiņu skaits, bet tīrs koda pieraksts un veiktspēja, izpildot to. Quote Link to comment Share on other sites More sharing options...
2easy Posted January 18, 2010 Report Share Posted January 18, 2010 mazliet no klasikas... http://en.wikiquote.org/wiki/Kenneth_Thompson One of my most productive days was throwing away 1000 lines of code. Quote Link to comment Share on other sites More sharing options...
Java Posted January 18, 2010 Report Share Posted January 18, 2010 Tad, kad būsi kompjūterzinātnieks (ja kādreiz būsi), varēsi arī pats izgudrot dažādas "atziņas", bet pagaidām pateikšu tev, ko, iespējams, nezināji: Lielākā daļa datorzinātnieku (arī tas pats C++ izgudrotājs) nepārāk formālās publikācijās dzen īpatnējus jociņus, kas nebūt nav jāuztver burtiski un jāsaprot tieši tā. Vēlreiz atkārtojos: Piekrītu, ka rindu skaitam kodā nevajadzētu būt lielam, bet svarīgāka tomēr ir koda kārtība un veiktspēja (neattiecas uz šai tēmā apskatīto piemēru tomēr). Quote Link to comment Share on other sites More sharing options...
2easy Posted January 18, 2010 Report Share Posted January 18, 2010 tas posts jau arī daļēji bija kā jociņš, jo negribēju piesieties/kritizēt tālāk, kā, piemēram, tagad: Kenneth Thompson neizgudroja ne C++, ne arī C, bet gan B (60-to gadu beigās) C izgudroja Dennis Ritchie (70-to gadu sākumā) C++ izgudroja Bjarne Stroustrup (80-to gadu sākumā) datoriķu jociņos ir daudz vērtīgu atziņu... Quote Link to comment Share on other sites More sharing options...
Java Posted January 18, 2010 Report Share Posted January 18, 2010 Nevienu brīdi neapgalvoju, ka Kenneth Thompson kaut ko izgudrojis, es labi zinu, ka Bjarne Stroustrup (viņš arī ir kompjūterzinātnieks) izgudroja C++, bet, baidīdamies uzrakstīt nepareizi viņa vārdu, nepieminēju, jo domāju vispār, ka to zin gandrīz katrs programmeris, ka tas ir tas vīrelis, kurš izgudrojis C++. Quote Link to comment Share on other sites More sharing options...
2easy Posted January 18, 2010 Report Share Posted January 18, 2010 ohh pārpratu :D:D:D Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.