Jump to content
php.lv forumi

Noņemt daļu no stringa beigām


HayDee

Recommended Posts

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 by HayDee
Link to comment
Share on other sites

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"...

Link to comment
Share on other sites

<?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;
}

Link to comment
Share on other sites

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);

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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).

Link to comment
Share on other sites

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...

Link to comment
Share on other sites

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++.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...