konto usunięte

Temat: Przeszukiwanie tablicy w php

Witam serdecznie,
Mam taką tablicę:

array(2) {
[0]=>
array(11) {
["id"]=>
string(1) "2"
["nazwa"]=>
string(5) "nazwa"
["cena"]=>
string(6) "100.00"
["ilosc"]=>
int(4)
["maxilosc"]=>
string(3) "444"
["dostawa"]=>
string(4) "5.00"
["vat"]=>
string(2) "23"
["stanproduktu"]=>
string(1) "1"
["aj_nazwa"]=>
string(9) "niebieski"
["aj_rozmiarX"]=>
string(3) "127"
["aj_rozmiar_wielkosc_X"]=>
string(1) "3"
}
[1]=>
array(11) {
["id"]=>
string(1) "4"
["nazwa"]=>
string(6) "nazwa1"
["cena"]=>
string(6) "106.00"
["ilosc"]=>
string(1) "1"
["maxilosc"]=>
string(1) "9"
["dostawa"]=>
string(4) "0.00"
["vat"]=>
string(1) "0"
["stanproduktu"]=>
string(1) "1"
["aj_nazwa"]=>
string(8) "czerwony"
["aj_rozmiarX"]=>
string(3) "136"
["aj_rozmiar_wielkosc_X"]=>
string(1) "1"
}
}

i kod:



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' =>($_POST['itemid']), 'nazwa' =>($_POST['i_nazwa']), 'cena' =>($_POST['i_cena']), 'ilosc' =>($_POST['ilosc']), 'aj_rozmiarX' =>($_POST['aj_rozmiarX']), 'aj_rozmiarX' =>($_POST['aj_rozmiar_wielkosc_X']));
} else{
echo "DUBEL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
$_SESSION['koszykzamowien'][$dubel]['ilosc'] = 2;
}


Funkcja recursive_array_search - funkcja wyszukuje duplikaty dla ID - i działa poprawnie.
Chciałbym ją przerobić tak, żeby wyszukiwała duplikaty po 3 kolumnach:
- id
- aj_nazwa
- aj_rozmiar_wielkosc_X

Próbowałem to przerobić tak:

function recursive_array_search($needle, $haystack, $where1, $where2) {
foreach($haystack as $key => $value) {
$current_key=$key;
// $where1 = aj_nazwa
// $where2 = aj_rozmiar_wielkosc_X
if($needle===$value OR ((is_array($value) && recursive_array_search($needle,$value) !== false) AND ($key['aj_nazwa'] == $where1 && $key['aj_rozmiar_wielkosc_X'] == $where2))) {
return $current_key;
}
}
return false;
}


ale niestety nie chce działać :(

Potrafiłby ktoś to poprawić?
Bardzo proszę o pomoc.
Łukasz
Marek Karmelski

Marek Karmelski PHP Programmer,
Magento dev, Agencja
reklamowa White
Ducky

Temat: Przeszukiwanie tablicy w php

Hej,
Wg mnie wykorzystywanie w tym przypadku rekurencji jest niepotrzebne, ba powiedziałbym zbędne, twoja tablica nie jest tablicą o nieokreślonym stopniu zagnieżdżenia. Proponowałbym coś innego.
Marek Karmelski

Marek Karmelski PHP Programmer,
Magento dev, Agencja
reklamowa White
Ducky

Temat: Przeszukiwanie tablicy w php

Bezsenność wygrała...

Moja propozycja:


<?php
$koszyk = array(
array(
'id' => 2,
'nazwa' => 'nazwa',
'cena' => 100,
'ilosc' => 4,
'maxilosc' => 444,
'dostawa' => 5,
'vat' => 23,
'stanproduktu' => 1,
'aj_nazwa' => 'niebieski',
'aj_rozmiarX' => 127,
'aj_rozmiar_wielkosc_X'=> 3
),
array(
'id' => 4,
'nazwa' => 'nazwa1',
'cena' => 106,
'ilosc' => 1,
'maxilosc' => 9,
'dostawa' => 0,
'vat' => 0,
'stanproduktu' => 1,
'aj_nazwa' => 'czerwony',
'aj_rozmiarX' => 136,
'aj_rozmiar_wielkosc_X' => 1
)
);

function findDubel($id, $nazwa, $rozmiar, $koszyk)
{
$find_dubel = false;
$dubel_key = false;
while ( ( list($key,$item) = each($koszyk) ) && !$find_dubel) {
if ($item['id'] == $id && $item['aj_nazwa'] == $nazwa && $item['aj_rozmiar_wielkosc_X'] == $rozmiar) {
$find_dubel = true;
$dubel_key = $key;
}
}
return $dubel_key;
}


$dubel = findDubel(4, 'czerwony', 1, $koszyk);

if ($dubel === false) {
// coś tam
} else {
// mamy dubla!
$koszyk[$dubel]['ilosc']++;
}

print_r($koszyk);

Temat: Przeszukiwanie tablicy w php

Przecież to można zrobić dużo łatwiej ...
Przed dodaniem do tablicy przelecieć ją foreachem i sprawdzić czy takie id towaru już tam jest.
Jeżeli jest to nie dodajemy i po sprawie.Ten post został edytowany przez Autora dnia 12.07.15 o godzinie 10:45
Tomasz Zadora

Tomasz Zadora programuję

Temat: Przeszukiwanie tablicy w php

http://php.net/array_search
If needle is found in haystack more than once, the first matching key is returned. To return the keys for all matching > values, use array_keys() with the optional search_value parameter instead.

Mam radę: zanim zacznie się wymyślać swoje algorytmy, sposoby, etc. warto poszukać wśród tego co oferuje samo PHP oraz opcjonalne moduły i wykorzystywać to maksymalnie.

Do działań rekurencyjnych polecam array_walk_recursive, czyli:

http://php.net/manual/en/function.array-walk-recursive...
Robert P.

Robert P. Senior PHP Developer

Temat: Przeszukiwanie tablicy w php

Zgadzam się z Tomaszem, można też użyć array_map z array_unique + sprytny trick z serializacją

array_map("unserialize", array_unique(array_map("serialize", $input)));


z http://stackoverflow.com/questions/307674/how-to-remov...

jest wiele sposóbów na rozwiązanie tego problemu, ale na pewno nie korzystał bym z własnych rozwiązań tylko użył wbudowanych funkcji takich jak array_walk, array_map, array_unique itp.

Zachowanie serializacji można zmienić za pomocą magicznych metod w PHP

Następna dyskusja:

Narzędzia do PHP




Wyślij zaproszenie do