konto usunięte

Temat: Usuwanie danych z tablicy

Witam serdecznie.
Mam takie tworzenie tablicy (kod uproszczony):

<?php
if(!isset($_SESSION['tablica'])) //jezeli sesja po raz pierwszy otwarta
{
$_SESSION['tablica']=array();
}
if(!isset($_SESSION['id']))
{
$_SESSION['id']=0;
}
if(isset($_GET['i']))
{
$_SESSION['tablica'][$_SESSION['id']]=$_GET['i']."|".$_GET['ilosc'];
$_SESSION['id']++;
}
?>


$_GET[id] = id produktu
$_GET[ilosc] = ilość produktów

Chciałbym teraz jakoś usuwać rekordy z tej tablicy...
Np. wszystkie które mają $_GET[id] = 1...

Wie ktoś może jak to zrobić?


Z góry dzięki za pomoc,
pozdrawiam Łukasz

konto usunięte

Temat: Usuwanie danych z tablicy

No to dodatkowy if i np. unset():)Paweł Makowski edytował(a) ten post dnia 03.08.09 o godzinie 09:28

konto usunięte

Temat: Usuwanie danych z tablicy

ale w sumie to bardzo zachłanny sposób - przechowywać tak każdy produkt (w tablicy dwuwymiarowej 2 x N, gdzie dopiero pole przechowuje identyfikator...), bo poszukiwanie elementu do usunięcia odbywa się w czasie liniowym... Nie lepiej przechowywać ilośc danego produktu w polu tablicy o id równym jego id? ($_SESSION['tablica'][3] = 5 dla 5 sztuk produktu o id 3) Usuwanie (i np zmiana ilości sztuk produktu w koszyku) potem jest banalna (unset), a wypisywanie foreachem załatwia sprawę ;) (jakby się np ktoś zastanawiał co z tymi id, ktore nie są wykorzystane w zamówieniu, a produktów mamy tysiące)Lidia Wilczyńska edytował(a) ten post dnia 03.08.09 o godzinie 10:08

konto usunięte

Temat: Usuwanie danych z tablicy

Lidia Wilczyńska:
ale w sumie to bardzo zachłanny sposób - przechowywać tak każdy produkt (w tablicy dwuwymiarowej 2 x N, gdzie dopiero pole przechowuje identyfikator...), bo poszukiwanie elementu do [..]

Tak by bylo najlepiej.
Chcac jednak zachowac oryginalna strukture podana przaz autora mozna tez zrobic:

function clean_get(&$item, $key, $k2check, $v2clean) {
if ($key == $k2check && $item == $v2clean) unset($item);
}

array_walk($_GET,'clean_get', 'id', 1);Łukasz S. edytował(a) ten post dnia 03.08.09 o godzinie 10:53

konto usunięte

Temat: Usuwanie danych z tablicy

Warning: array_walk() expects at most 3 parameters, 4 given in /var/www/gtxsystem.pl/strony_klientow/bluszcz/systemania/add/dodajzamowienie.php on line 10

Qurcze,coś nie do końca ten kod działa.... :(

Łukasz S.:
Lidia Wilczyńska:
ale w sumie to bardzo zachłanny sposób - przechowywać tak każdy produkt (w tablicy dwuwymiarowej 2 x N, gdzie dopiero pole przechowuje identyfikator...), bo poszukiwanie elementu do [..]

Tak by bylo najlepiej.
Chcac jednak zachowac oryginalna strukture podana przaz autora mozna tez zrobic:

function clean_get(&$item, $key, $k2check, $v2clean) {
if ($key == $k2check && $item == $v2clean) unset($item);
}

array_walk($_GET,'clean_get', 'id', 1);Łukasz S. edytował(a) ten post dnia 03.08.09 o godzinie 10:53

konto usunięte

Temat: Usuwanie danych z tablicy

ma ktoś może na to jakiś inny pomysł? Bardzo zależałoby mi na tym żeby pozostać przy moim sposobie...
Michał Jarosz

Michał Jarosz Frontend Developer &
Team Leader

Temat: Usuwanie danych z tablicy

Łukasz S.:
function clean_get(&$item, $key, $k2check, $v2clean) {
if ($key == $k2check && $item == $v2clean) unset($item);
}

array_walk($_GET,'clean_get', 'id', 1);Łukasz S. edytował(a) ten post dnia 03.08.09 o godzinie 10:53

No nie wiem...

http://pl.php.net/manual/en/function.array-walk.php
Users may not change the array itself from the callback function. e.g. Add/delete elements, unset elements, etc. If the array that array_walk() is applied to is changed, the behavior of this function is undefined, and unpredictable.

konto usunięte

Temat: Usuwanie danych z tablicy

Łukasz Peta:
ma ktoś może na to jakiś inny pomysł? Bardzo zależałoby mi na tym żeby pozostać przy moim sposobie...

przy sposobie, który zaproponowałeś do dodawania kolejnych elementów potrzebne by było jeszcze przesunięcie tablicy po usunięciu elementu...
Poza tym - czy ja dobrze widzę, że pojedynczy element to tak naprawdę łańcuch znakowy liczba + '|' + liczba?? To jest absolutnie złe rozwiązanie - tak się nie robi, bo to wymaga kolejnych skomplikowanych operacji jeśli np chcesz porównywać to id (do usunięcia, do dodania większej ilości danego elementu do koszyka etc...)... - za każdym razem ten string trzeba rozbijać, żeby znaleźć id.
Ponadto co, jeśli niezdefiniowane jest $_GET['ilosc']? Tez trzeba cos zrobic...

na początek zmień swój kod na taki:
<?php
if(!isset($_SESSION['tablica'])) //jezeli sesja po raz pierwszy otwarta
$_SESSION['tablica']=array();

if(!isset($_SESSION['id']))
$_SESSION['id']=0;

if(isset($_GET['i']))
{

//na wypadek niezdefiniowanego get-ilosc
$ilosc = (isset($_GET['ilosc']) && $_GET['ilosc']>0)?$_GET['ilosc']:1;


$_SESSION['tablica'][$_SESSION['id']]['id']=$_GET['i'];
$_SESSION['tablica'][$_SESSION['id']]['ilosc']=$ilosc;

$_SESSION['id']++;

}

?>


dalej najprostszym sposobem będzie przeszukiwanie liniowe - napotkasz element - usuwasz, przerywasz pętlę... (tylko tu powstanie dziura, a nie wiem jak wypisujesz zawartość tablicy)

[... tu była propozycja nieoptymalna - będę się za to smażyć w piekle ;P]

Ale podtrzymuję to, ze kod należałoby przebudować - jak już się uczyć, to uczyć się robić coś dobrze i optymalnie...Lidia Wilczyńska edytował(a) ten post dnia 04.08.09 o godzinie 00:16

konto usunięte

Temat: Usuwanie danych z tablicy

mógłbym prosić jakiś przykład? bo kurcze nie bardzo to łapie :(

konto usunięte

Temat: Usuwanie danych z tablicy

Qurcze,coś nie do końca ten kod działa.... :(

Bo to nie byl gotowy kawalek dzialajacego kodu :)
Wieksza ilosc parametrow przekazujesz w tablicy, a unset() zamieniasz na zapis elementu do dodatkowej tablicy.

Tyle, ze to rozwiazanie jest wolniejsze niz sprawdzenie calej tablicy via foreach().

Ale jak juz pisala Lidia, Twoj sposob jest wadliwy z samego zalozenia. Moze lepiej nad tym popracowac.

konto usunięte

Temat: Usuwanie danych z tablicy

Łukasz Peta:
mógłbym prosić jakiś przykład? bo kurcze nie bardzo to łapie :(
Kurczę, to już jest problem elementarny, wg mnie zupełne podstawy pisania jakichkolwiek algorytmów... Uczysz się tego sam, czy z jakichś kursów? Przyznam, że jakbyś sam do tego doszedł, to po 1 - większa frajda, po 2 - większy efekt dydaktyczny....

pierwsza część mojej odpowiedzi - proste usunięcie elementu:


//$_GET['usun'] - zmienna przechowująca id elementu do usunięcia.

for($i = 0; $i<$_SESSION['id']; $i ++){
if($_SESSION['tablica'][$i]['id'] == $_GET['usun']){
unset ($_SESSION['tablica'][$i]['id']);
unset ($_SESSION['tablica'][$i]['ilosc']);
break;
}
}


kod ten jednak nie uwzględnia poradzenia sobie z "dziurą", która powstanie, jeśli usunięty zostanie element środkowy (tak oto mozesz mieć teraz tablicę o indeksach 0,1,2,4,5 - przy wypisywaniu kolejno - przy trójce wyskoczy błąd). Ponadto $_SESSION['id'] przestaje być zmienną oznaczającą ilość elementów w tablicy, a pozostaje jedynie kolejnym wolnym (czyt - dotąd nieużywanym ;P) id.

Dlatego skoro już się upierasz przy tym rozwiązaniu trzeba jeszcze z tym zawalczyć. Ale na to już wpadnij sam...
Bo chyba w tych kursach ominąłeś parę rozdziałów ;)Lidia Wilczyńska edytował(a) ten post dnia 04.08.09 o godzinie 00:17

konto usunięte

Temat: Usuwanie danych z tablicy

Jeśli chodzi o ilość elementów w tablicy, można do tego użyć funkcji count(). Co do przesuwania natomiast, moim zdaniem lepiej rozwiązać ten problem, wstawiając w "dziurę" ostatni element z tablicy. Można nawet w funkcji usuwającej przypisywać do kasowanego miejsca ostatni element z tablicy, a potem go unsetować.

konto usunięte

Temat: Usuwanie danych z tablicy

Zmiana algorytmu pociągała by za sobą konieczność modyfikacji kolejnych elementów, a jak sama zauważyłaś Lidio Nasz kolega ominą kilka rozdziałów z wielu książek, nie tylko tej o algorytmach

Ale jest światełko w tunelu widać że się uczy, poziom przedstawianych problemów zwyżkuje ;)

konto usunięte

Temat: Usuwanie danych z tablicy

Bartosz Zasada:
Jeśli chodzi o ilość elementów w tablicy, można do tego użyć funkcji count(). Co do przesuwania natomiast, moim zdaniem lepiej rozwiązać ten problem, wstawiając w "dziurę" ostatni element z tablicy. Można nawet w funkcji usuwającej przypisywać do kasowanego miejsca ostatni element z tablicy, a potem go unsetować.
No tak, tutaj przecież nic nie jest po kolei. No i jest łatwiej - może kolega zrozumie ;P
A ja się będę smażyć w piekle za bardziej skomplikowane pomysły ;P
Dobranoc :)Lidia Wilczyńska edytował(a) ten post dnia 04.08.09 o godzinie 00:18

konto usunięte

Temat: Usuwanie danych z tablicy

ww kod nie działa :(

tak, douczam się PHP ;) ogólnie chciałbym to co mam jakoś poprawić, i na tym dalej eksperymentować :) to nie jest tak że znalazłem problem i od razu napisałem tutaj - siedziałem na tym i męczyłem się dość dłuuugo sam wcześniej...

konto usunięte

Temat: Usuwanie danych z tablicy

[ ten post byl zly ]Bartosz Zasada edytował(a) ten post dnia 04.08.09 o godzinie 11:53

konto usunięte

Temat: Usuwanie danych z tablicy

Bartosz Zasada:
$tab[$i] = $tab[count($tab)];
unset($tab[$i]);
[/code]

Po co ten count()? Samo unset($tab[$i]) wystarczy.
Poza tym $tab[count($tab)] dla typowej tablicy zawsze zwroci NULL. "Typowa tablica" jest numerowana sekwencyjnie od zera, a liczona od jeden, wiec element count($tab) nie istnieje (stad NULL). Jesli nawet element istnieje, niepotrzebnie kopiujesz jego wartosc do innego elementu, ktory moment pozniej usuwasz...

konto usunięte

Temat: Usuwanie danych z tablicy

Sorry, robilem w pospiechu i pomylilem sie. Po pierwsze oczywiscie, ze nie $tab[count($tab)], tylko $tab[count($tab) - 1], a po drugie, nie unset($tab[$i]), tylko tez unset($tab[count($tab) - 1]). Napisalem o jednym, a zakodowalem cos innego. Moj poprzedni post do smieci ;)

Prawidlowy kod powinien wygladac tak:


// $i = usuwany indeks

$tab[$i] = $tab[count($tab) - 1];
unset($tab[count($tab) - 1]);
Bartosz Zasada edytował(a) ten post dnia 04.08.09 o godzinie 11:54
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Usuwanie danych z tablicy

Zamiast:
Łukasz Peta:

<?php[/quote]> if(!isset($_SESSION['tablica'])) //jezeli sesja po raz pierwszy [quote]otwarta
{
$_SESSION['tablica']=array();
}
if(!isset($_SESSION['id']))
{
$_SESSION['id']=0;
}
if(isset($_GET['i']))
{
$_SESSION['tablica'][$_SESSION['id']]=$_GET['i']."|".$_GET['ilosc'];
$_SESSION['id']++;
}
?>

wystarczy jedna linijka:

$_SESSION['tablica'][]=$_GET['i']."|".$_GET['ilosc'];


Żeby usunąć element o zadanym id wystarczy:

if(isset($_SESSION['tablica'])) {
foreach($_SESSION['tablica'] as $i => $v) {
if(strncmp($v, $id_do_usuniecia."|", strlen($id_do_usuniecia)+1) == 0) {
unset($_SESSION['tablica'][$i]);
}
}
$_SESSION['tablica'] = array_values($_SESSION['tablica']);
}

Można też przepisywać te które nie są do usunięcia do nowej tablicy.Kamil Szot edytował(a) ten post dnia 08.08.09 o godzinie 16:56

Następna dyskusja:

Usuwanie elementów z tablicy




Wyślij zaproszenie do