Kasowanie odpowiednich znaków z ciągu


(Sobladen) #1

Witam,

W bazie mam zapisany taki ciąg:

1,4,16,23,5,8

Jak z tego ciągu wykasować np. liczbę: 16 ?

Po wykonaniu tego miało by to wyglądać tak:

1,4,23,5,8

$liczba_del = 16;

Z góry dziękuje za odpowiedź.


(Jacek705) #2
$ciąg='1,4,16,23,5,8';

$table=explode(',',$ciag);

foreach($table as $row){

if ($row!=16){

$ciag2.=$row;

}

}

Pisałem teraz, nie sprawdzałem czy działa, ale może coś Ci podpowie :slight_smile:


(Sobladen) #3

Dzięki za odpowiedź.

Skrypt jednak nie działa. Gdy wykasuje "!" przed = to wyświetla tylko 16. Wiec z ! powinno być ok, a nie wyświetla (dałem echo).

A i w tym przykładzie może być problem jeśli chodzi np. o usuniecie 1 i 8 bo przecinki maja tylko z jednaj strony.

Przydało by się coś takiego co wyświetli odrazu $ciag2 bez petli. Może jest jakas funkcja?

EDIT:

Udało mi się znaleść funkcję, jednak nie wiem jak zrobić aby dobrze działała.

$v = 16;

$ciag='1,4,16,23,5,8';

$ciag2 = str_replace('$v,', '', $ciag);

echo $ciag2;

Ten skrypcik usunie 16 i efekt jest taki:

1,4,23,5,8

Jednak problem jest z ostatnią liczbą (tj. 8 ) ponieważ nie ma przecinku na końcu i nie działa ten kod wtedy.

Prosze o pomoc.


(kostek135) #4
$ciag='1,4,16,23,5,8';

$szukanaliczba='16';

$ciag2 = str_replace($szukanaliczba, ',', $ciag);

$ciag3 = str_replace(',,', '', $ciag2);

-- Dodane 29.06.2010 (Wt) 0:51 --

W twoim jest problem, znikają przecinki jego przykład definitywnie pokazuje ze ta struktura ma pozostać nienaruszona. Co do mojego, masz racje za sekundę poprawie.

Dochodzę do wniosku, że jednak nie jest to osiągalne, nie koniecznie musi to być pierwsza liczba w ciągu.


(GediMaster) #5

Sposób jj_el jest OK, ale z lekką modyfikacją:

<?php


$liczba_del = 16;

$ciag = '1,4,16,23,5,8';


echo $ciag."\n";


foreach($arr = explode(',', $ciag) as $k => $v)

{

	if ($v == $liczba_del) unset($arr[$k]);

}


$ciag = join(',', $arr);


echo $ciag;


?>

(Sobladen) #6

Działa, dziękuje.


(GediMaster) #7

PS

Ale z preg_replace() się wstrzymaj. Pośpieszyłem się. Nie będzie działać poprawnie :). Z foreach() będzie spoko :wink:.


(Sobladen) #8

Jednak nie działa tak jak należy. Prosze sprawdzic np. to:

$liczba_del = 1;

$ciag = '1,4,16,23,11,5,238';


echo $ciag."
";


$ciag = preg_replace('/(.'.$liczba_del.')|('.$liczba_del.'.)/', '', $ciag);


echo $ciag;

//EDIT:

Niestety potrzebny jest mi skrypt bez pętli, ponieważ jest on umieszczony juz wewnątrz innych 2 pętli i nie działa wtedy prawidłowo.


(GediMaster) #9

Pisałem o preg_replace() wyżej :stuck_out_tongue_winking_eye:. Przyznałem, ze błędny kod :).

A czemu ma nie działać prawidłowo? Nie rozumiem? Będzie działać na pewno, tylko zadbaj o unikalne nazwy zmiennych w pętlach. Poza tym jeśli jest tylko jedno wystąpienie zmiennej $liczba_del w danym ciągu, to można i tak:

<?php


$liczba_del = 16;

$ciag = '1,4,16,23,5,8';


echo $ciag."\n";


$arr = explode(',', $ciag);


unset($arr[array_search($liczba_del, $arr)]);


$ciag = join(',', $arr);


echo $ciag;


?>

(Sobladen) #10

Teraz działa w moim przypadku.

Ale sprawdziłem taż, jak będzie jako ciąg samo 11 i będę chciał usunąć 1, a nie ma tego w ciągu to usuwa się całe.

//edit:

jeśli ciąg jest taki:

$ciag = '7,20,88,29';

a liczba do usunięcia:

$del = 1;

której nie ma w ciagu to usuwa się zawsze to co jest na początku.

Dobrze by było gdyby dało się to jakoś naprawić, żeby nie usuwało nic.

Wtedy by już wszystko pięknie chodziło.


(GediMaster) #11

No wiesz :wink:. Ja pisałem z głowy, ale dobrze, że sprawdzasz, przynajmniej się uczysz :wink:. Ale jak jesteś dociekliwy, to powinieneś się domyśleć, że przydałoby się dodać warunek sprawdzający, czy w ogóle taka liczba szukana występuje w tablicy, więc:

<?php


$liczba_del = 1;

$ciag = '11,4,23,5,1,8,16';


echo $ciag."\n";


$arr = explode(',', $ciag);


if (in_array($liczba_del, $arr))

	unset($arr[array_search($liczba_del, $arr)]);


$ciag = join(',', $arr);


echo $ciag;


?>

(floyd) #12

Jeszcze jeden sposób:

$v = 8;

$ciag='1,4,16,23,5,8';

$ciag2 = str_replace(",".$v.',', ',', ",".$ciag.",");

$ciag2=substr($ciag2,1,strlen($ciag2)-2);

echo $ciag2;

(Sitemaster) #13

a niby dlaczego preg_replace ma nie działać?

<?php


$in='1,4,16,23,5,8';

$del=16;


$out = preg_replace("#(^$del,|,$del$)#", '', $in);

$out = preg_replace("#(,$del,)#", ',', $out);


echo $out;

?>

(Sobladen) #14

Kurde, no przecież. Jakoś nie pomyślałem na usprawiedliwienie jest to że dopiero zaczynam :slight_smile:

Śmiga aż miło.

Dziękuje.

Pozdrawiam

//edit

Nie odświeżyłem i nie widziałem Waszych postów. Ale się sprawdzi.


(GediMaster) #15

@api :). Mój poprzedni sposób z zastosowaniem preg_replace(), który pisałem bez sprawdzenia by nie działał :).


(Sobladen) #16

W tym przykładzie działa ok, do momentu gdy jest coś takiego:

$v = 1;

$ciag='1,4,16,11,23,5,8';


echo $ciag.'
';


$ciag2 = str_replace($v.',', '', $ciag);

if ($ciag==$ciag2)

{

$ciag2 = str_replace(','.$v, '', $ciag2);

}

echo $ciag2;

Czyli gdy jest 11, to usuwa 1, a 2 jedynkę zostawia i wychodzi nowa liczba 123. ##############################

Ten przykład z tego co sprawdziłem działał zawsze.

Dzięki.


(system) #17

Można prościej :slight_smile:

$in=array(1,4,16,23,5,8);

$out=array(4);


echo implode(",",array_diff($in,$out));

Można usuwać więcej liczb, dając każdą z nich po przecinku np:

$out=array(4,8,20,40,1,itd..);

(floyd) #18

Rzeczywiście, to było błędne rozwiązanie i dlatego poprawiłem je na takie:

$v = 1;

$ciag='1,4,16,11,23,5,8';

$ciag2 = str_replace(",".$v.',', ',', ",".$ciag.",");

echo substr($ciag2,1,strlen($ciag2)-2);

Jak widać rozwiązań tego problemu może być wiele i można by nawet zrobić konkursik kto znajdzie jeszcze inne rozwiązanie. :slight_smile: