[php]Szukanie w tablicy


(northwest) #1

Witam serdecznie,

Mam taki kod do dodawania wartości do tablicy:

$_SESSION['koszykzamowien'][] = array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena']));

 

Co daje taką tablicę:

 

 

Array
(
    [0] => Array
        (
            [id] => 4
            [nazwa] => nazwa1
            [cena] => 106.00
        )

    [1] => Array
        (
            [id] => 4
            [nazwa] => nazwa1
            [cena] => 106.00
        )

    [2] => Array
        (
            [id] => 4
            [nazwa] => nazwa1
            [cena] => 106.00
        )

    [3] => Array
        (
            [id] => 2
            [nazwa] => nazwa
            [cena] => 100.00
        )

    [4] => Array
        (
            [id] => 2
            [nazwa] => nazwa
            [cena] => 100.00
        )

    [5] => Array
        (
            [id] => 4
            [nazwa] => nazwa1
            [cena] => 106.00
        )

    [6] => Array
        (
            [id] => 2
            [nazwa] => nazwa
            [cena] => 100.00
        )

)

 

 

 

W momencie gdy wyszukuję wartość za pomocą kodu:

$dubel = array_search(array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena'])), $_SESSION['koszykzamowien']);

 

Otrzymuję indeks duplikatu - co jest super. Tylko 100% wartości musi się pokrywać - a chciałbym żeby tylko sprawdzało po 1.

Czy da się jednak szukać tylko i wyłącznie po ID  ($_POST[imtemid])- a nie całej wartości dodawanej tablicy?

 

 


(hindus) #2

No to zawsze możesz klasycznie przeiterować tablicę w poszukiwaniu interesującego Cię kryterium, ewentualnie użyć

 

$arr = array(‘id’ =>czysc_sql_liczby($_POST[‘itemid’]), ‘nazwa’ =>baza_zapis($_POST[‘i_nazwa’]), ‘cena’ =>baza_zapis($_POST[‘i_cena’]));

$key = array_search(4, array_column($arr, ‘id’));


(northwest) #3

nie wychwytuje dubla :frowning:


(hindus) #4

Ok, pomyłka z mojej strony, niepotrzebnie próbowałem dawać kod zamiast objaśnienia, które jest następujące:

 

 $INDEKS_ZNALEZIONEGO_ELEMENTU = array_search($SZUKANEID, array_column($TABLICA_2D_W_KTOREJ_SZUKASZ, $NAZWA_KOLUMNY)); 


(northwest) #5

Zrobiłem coś takiego:

 

 

function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;
        if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
            return $current_key;
        }
    }
    return false;
}

$dubel = recursive_array_search($_POST['itemid'], $_SESSION['koszykzamowien']);

        if($dubel === FALSE){
            $_SESSION['koszykzamowien'][] = array('id' =>czysc_sql_liczby($_POST['itemid']), 'nazwa' =>baza_zapis($_POST['i_nazwa']), 'cena' =>baza_zapis($_POST['i_cena']), 'ilosc' =>czysc_sql_liczby($_POST['ilosc']), 'aj_rozmiarX' =>baza_zapis($_POST['aj_rozmiarX']), 'aj_rozmiar_wielkosc_X' =>baza_zapis($_POST['aj_rozmiar_wielkosc_X']));
        } else{
            echo "DUBEL!!!!!!!!!!!!!!!!!";
            $_SESSION['koszykzamowien'][$dubel]['ilosc'] = 2;
        }

 

 

 

Tylko czy jest możliwość za pomocą tego: recursive_array_search - wyszukanie po 3 kolumnach?

 

 

W sensie dubel = przy identycznym id oraz aj_rozmiarX i aj_rozmiar_wielkosc_X? 


(hindus) #6

Kopiujesz gotowce bez zrozumienia, mam wrażenie. Napiszę w pseudokodzie, żebyś mógł się czegoś nauczyć.

 

funkcja toDuplikat(tablica_elementow, pole1, pole2, pole3){

 

    dla każdego elementu w tablicy tablica_elementów {

        jeśli tablica_elementów[‘nazwa_pola1’] == pole1

            || tablica_elementow[‘nazwa_pola2’] == pole2

            || tablica_elementow[‘nazwa_pola3’] == pole3

        zwróć prawda;

    }

    

    zwróć fałsz;

}