Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Usuwanie ze stringa pozycji od końca
Forum PHP.pl > Forum > Przedszkole
jakkolwiek
Witam,
męczę się z pewnym problemem, a nie mogę nigdzie znaleźć odpowiedzi na to albo źle szukam...
Od razu przejdę do rzeczy - mam tablicę zawierającą wartości: 1000000, 1010000, 1011000, 1011010. Muszę zrobić następującą akcję:
dodać na początek stringa 0 (co nie jest oczywiście problemem) i następnie od końca stringa usunąć 00 parami, tzn. na podanych przykładach powinno po wykonaniu skryptu wyjść:
1000000 -> 01
1010000 -> 0101
1011000 -> 010110
1011010 -> 0011010

innymi słowy - powinny zostać usunięte po dwa zera od tyłu tylko jeżeli istnieją w parze, aż nie natrafi na inny znak lub parę skłądającą się z 0 i czegoś lub czegos i 0. Kombinuje dosłownie jak koń pod górę i po próbowaniu różnych sposobów - jedyne co do tej pory mi wyszło to pętla for... Może ktoś kojarzy funkcję, która pozwala na odcinanie od końca? Czy w jaki sposób to ugryźć?!

  1. $w = array('1000000','1010000','1011000','1011010');
  2. for($i = 0; $i < 4; $i++) {
  3. echo $w[$i].'<br>';
  4. }


próbowałem w to wmieszać pętlę while, ale nie wychodziło mi zupełnie. Nie wiem jak do tego podejść... ;/
nospor
ech... a zwykly preg_replace by wystarczyl winksmiley.jpg
jakkolwiek
Cytat(nospor @ 23.09.2009, 13:56:02 ) *
ech... a zwykly preg_replace by wystarczyl winksmiley.jpg


Racja! Nie minęła chwila i gotowe! Dziękuję bardzo za pomoc smile.gif

A nie, jednak nie do końca jest to tak jak powinno teraz. Źle opisałem problem, tzn. pominąłem pewny ważny warunek.
Usuwanie musi działać tylko do czasu napotkania innej pary, bo aktualnie preg_replace faktycznie usuwa parę zer, ale usuwa wszytskie
i w ten sposób jeżeli kod mam: 0100000 to usuwa poprawnie, ale jeżeli mam kod: 1029005 to usuwa dwa zera ze środka, a taki kod powinien zostawić. Chodzi o to, że jeżeli skrypt napotka na końcu stringa na dwa zera to je usuwa i tak dalej, ale jeżeli napotka na coś innego to zostawia kod i przechodzi do kolejnego.

  1. $uchwyt = fopen("code.csv", 'r');
  2. while(($data = fgetcsv($uchwyt, 1000, " ")) !== false) {
  3. list($col1, $col2) = $data;
  4. $w = '0';
  5. $s= $w.$col1;
  6. echo($s.'<br>');
  7. //for($i = 0; $i < 18; $i++) {
  8. // echo(preg_replace('(00)', '', $s[$i])."<br>");
  9. //}
  10. }
  11.  
  12. fclose($uchwyt);


Całość musi działać tak, że po wczytaniu kodów z csv usuwa te nieszczęsne zera. I z tym nie mogę sobie poradzić jednak :/
nospor
a widzisz... źle napisales wyrazenie. bo wziales same zera a nie wziales pod uwage ze ma byc koniec stringu

  1. $zm = '10000100000';
  2. $zm = preg_replace('/(00)+$/','',$zm);
  3. echo $zm;
jakkolwiek
Cytat(nospor @ 23.09.2009, 14:19:25 ) *
a widzisz... źle napisales wyrazenie. bo wziales same zera a nie wziales pod uwage ze ma byc koniec stringu

[PHP] pobierz, plaintext
  1. $zm = '10000100000';
  2. $zm = preg_replace('/(00)+$/','',$zm);
  3. echo $zm;
[PHP] pobierz, plaintext



Dziękuję za pomoc jeszcze raz! smile.gif
thek
Ja bym się bawił w coś w stylu:
  1. $change = true;
  2. $was_changed = false;
  3. while($change) {
  4. if(substr($w[i], -2) == '00') {
  5. $w[i] = substr($w[i], 0, -2);
  6. $was_changed = true;
  7. } else
  8. $change = false;
  9. }
  10. if($was_changed)
  11. $w[i] = '0'.$w[i];
Oczywiście w pętli by takie coś z każdym elementem robił. Dlaczego tak? Bierze element i sprawdza jego dwa ostatnie znaki. Jeśli jest to ciąg 00 to zamienia ciąg na pozbawiony ich i ustawia flagę, ze zaszła zmiana. Oraz próbuje robić to tak długo jak tylko się da. Flaga $change jest by rozpoznawać czy kontynuować zmienianie czy nie. zaś $was changed by rozpoznać czy zmiany zaszły i w razie czego dodać 0 na początku. Nie dawałem sprawdzenia z -2 do warunku while bezpośrednio bo by nam umknęło czy mamy owo dodatkowe 0 na początek dodać czy nie. Zastosowanie samego:
  1. while( substr($w[i], -2) == '00' ) {
  2. $w[i] = substr($w[i], 0, -2);
  3. }
gubi nam informację czy dodać to zero na początku czy nie. Nie wiemy bowiem ile razy się wykona i czy choć raz. Jeśli zaś dodamy dokładanie owego zera wewnątrz pętli while to może nam je dodać kilka razy a tego nie chcemy. Ma dodać tylko jednokrotnie.

EDIT: No i mnie ubiegli z wyrażeniem regularnym winksmiley.jpg A poza tym tak patrzyłem i w sumie do-while tu może być, bo przebiega całość przynajmniej raz smile.gif Które jest szybsze to trzeba by sprawdzić.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.