Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]problem z Pętla foreach
Forum PHP.pl > Forum > Przedszkole
miras
Witam, mam pewną pętlę foreach, w której muszę zwiększać parametr $this->i o jeden.. próbuję już ponad godzinę na różne sposoby i nie idzie za nic.. proszę o pomoc, kod:

  1.  
  2. $this->xtab = explode(",",$this->tab);
  3. $this->i=0;
  4.  
  5. foreach ($this->model_catalog_product->getProductOptions($this->xtab[$this->i]) as $option) {
  6.  
  7.  
  8. if ($option['type'] == 'select' || $option['type'] == 'radio' || $option['type'] == 'checkbox' || $option['type'] == 'image') {
  9. $option_value_data = array();
  10.  
  11. foreach ($option['option_value'] as $option_value) {
  12. if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) {
  13. if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) {
  14. $price = $this->currency->format($this->tax->calculate($option_value['price'], $product_info['tax_class_id'], $this->config->get('config_tax')));
  15. } else {
  16. $price = false;
  17. }
  18.  
  19. $option_value_data[] = array(
  20. 'product_option_value_id' => $option_value['product_option_value_id'],
  21. 'option_value_id' => $option_value['option_value_id'],
  22. 'name' => $option_value['name'],
  23. 'image' => $this->model_tool_image->resize($option_value['image'], 50, 50),
  24. 'price' => $price,
  25. 'price_prefix' => $option_value['price_prefix']
  26. );
  27. }
  28. }
  29.  
  30. $this->data['options'][] = array(
  31. 'product_option_id' => $option['product_option_id'],
  32. 'option_id' => $option['option_id'],
  33. 'name' => $option['name'],
  34. 'type' => $option['type'],
  35. 'option_value' => $option_value_data,
  36. 'required' => $option['required']
  37. );
  38. } elseif ($option['type'] == 'text' || $option['type'] == 'textarea' || $option['type'] == 'file' || $option['type'] == 'date' || $option['type'] == 'datetime' || $option['type'] == 'time') {
  39. $this->data['options'][] = array(
  40. 'product_option_id' => $option['product_option_id'],
  41. 'option_id' => $option['option_id'],
  42. 'name' => $option['name'],
  43. 'type' => $option['type'],
  44. 'option_value' => $option['option_value'],
  45. 'required' => $option['required']
  46. );
  47. }
  48. }
Michael2318
Nie rozumiem Cię... Masz kod mniej więcej taki:

  1. $tablica = explode(",", $array);
  2. $i = 0;
  3.  
  4. foreach($cos AS $costam)
  5. {
  6.  
  7. // bla bla
  8.  
  9. }


No i jakim cudem ma Ci się to $i zwiększać o jeden jak Ty tego nigdzie nie zdefiniowałeś...?

Musisz wewnątrz pętli dorzucić:

  1. $i++;


czyli:

  1. $tablica = explode(",", $array);
  2. $i = 0;
  3.  
  4. foreach($cos AS $costam)
  5. {
  6.  
  7. $i++;
  8.  
  9. // bla bla
  10.  
  11. }

_Borys_
Wewnątrz foreach() zwiększanie nic nie da, niech doda pętlę for() przed foreach() na podstawie count($this->xtab)
Michael2318
Cytat(_Borys_ @ 2.12.2013, 19:57:07 ) *
Wewnątrz foreach() zwiększanie nic nie da, niech doda pętlę for() przed foreach() na podstawie count($this->xtab)


Dać da - zliczy konkretną ilość "przelotów" przez pętlę. Nie wiem w jakim celu mu to dodawanie jest potrzebne bo tego nie napisał, aczkolwiek wykorzystuje ją w uwarunkowaniu samej pętli foreach() i w tym wypadku rzeczywiście to nic nie da. Możesz spróbować z tą pętlą for, tak jak zaproponował poprzednik np. tak:

  1. for($i = 0; $i <= count($array); $i++)
  2. {
  3. foreach($this->costam[$i] AS costam)
  4. {
  5. // bla bla
  6. }
  7. }
miras
Nie wiem dlaczego, ale to mi nie chce działać, bo nic mi nie wyświetla, a te zliczanie mi potrzebna (jak zauwazyles) zeby zmieniac wartosc w pętli foreach()

  1. for($i = 0; $i <= count($array); $i++)
  2. {
  3. foreach($this->costam[$i] AS costam)
  4. {
  5. // bla bla
  6. }
  7. }


sa jakies inne rozwiazania? bo jak wpisze np

  1. $this->xtab = explode(",",$this->tab);
  2. foreach ($this->model_catalog_product->getProductOptions($this->tabx[1]) as $option) {


to mi dziala, juz nie mam pojecia co jest
Michael2318
Pokaż cały ten kod, który Ci nie działa (jak go zedytowałeś).
miras
  1. $this->data['options'] = array();
  2.  
  3. $xtab=array();
  4. $xtab = explode(",",$this->tab);
  5. for($ii = 0; $ii < count($xtab); $ii++) {
  6. foreach ($this->model_catalog_product->getProductOptions($xtab[$ii]) as $option) {
  7.  
  8. if ($option['type'] == 'select' || $option['type'] == 'radio' || $option['type'] == 'checkbox' || $option['type'] == 'image') {
  9. $option_value_data = array();
  10.  
  11. foreach ($option['option_value'] as $option_value) {
  12. if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) {
  13. if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) {
  14. $price = $this->currency->format($this->tax->calculate($option_value['price'], $product_info['tax_class_id'], $this->config->get('config_tax')));
  15. } else {
  16. $price = false;
  17. }
  18.  
  19. $option_value_data[] = array(
  20. 'product_option_value_id' => $option_value['product_option_value_id'],
  21. 'option_value_id' => $option_value['option_value_id'],
  22. 'name' => $option_value['name'],
  23. 'image' => $this->model_tool_image->resize($option_value['image'], 50, 50),
  24. 'price' => $price,
  25. 'price_prefix' => $option_value['price_prefix']
  26. );
  27. }
  28. }
  29.  
  30. $this->data['options'][] = array(
  31. 'product_option_id' => $option['product_option_id'],
  32. 'option_id' => $option['option_id'],
  33. 'name' => $option['name'],
  34. 'type' => $option['type'],
  35. 'option_value' => $option_value_data,
  36. 'required' => $option['required']
  37. );
  38. } elseif ($option['type'] == 'text' || $option['type'] == 'textarea' || $option['type'] == 'file' || $option['type'] == 'date' || $option['type'] == 'datetime' || $option['type'] == 'time') {
  39. $this->data['options'][] = array(
  40. 'product_option_id' => $option['product_option_id'],
  41. 'option_id' => $option['option_id'],
  42. 'name' => $option['name'],
  43. 'type' => $option['type'],
  44. 'option_value' => $option['option_value'],
  45. 'required' => $option['required']
  46. );
  47. }
  48. }
  49. }


no ja juz wariuje..
jak dam tak:

  1. for($ii = 0; $ii <= count($xtab); $ii++)


to wywala mi błąd:

Notice: Undefined offset: 3 in ... on line 74


74 linijka to:

  1. foreach ($this->model_catalog_product->getProductOptions($xtab[$ii]) as $option) {
Michael2318
A co w ogóle zwraca Ci count($xtab) ?
miras
nie bardzo mam jak to sprawdzić, bo robię to w kontrolerze, ale jak tam numer tablicy 0 to nic się nie wyswietla, a jak dam 1 to jest dobrze (czyli w przy jednej pozycji się wyświetla, a przy drugiej nie i tak powinno być, a jak zrobię, w pętli (tak jak podałem w przykładzie) to w obu pozycjach wyświetla mi się to samo, a powinno w jednej się wyświetlić, a w drugiej nie... nie zrozumiecie pewnie, bo namotałem, ale w tablicy jest wszystko ok..
Turson
print_r($xtab) i wyjdzie szydło z worka
miras
Array ( [0] => [1] => 51 [2] => 52 [3] => 51 [4] => 52 ) to mi zwróciło
_Borys_
Skoro wartości się powtarzają to i w foreach() się powtarza to samo. Poza tym masz pewnie przecinek na początku $this->tab
miras
a jak się nazywała funkcja usuwająca powtarzające się i puste rekordy ?
_Borys_
$xtab = array_values(array_filter(array_unique($xtab)));
pierwsza przypisuje nowe klucze kolejno, druga usuwa puste, trzecia zwraca unikalne wink.gif
miras
  1. Array ( [0] => [1] => 51 [2] => 52 [3] => 51 [4] => 52 )





To mi zwraca.. czyli nadal coś nie tak.

no teraz dobrze.. ale nadal mi wyświetla w 2ch pozycjach, a powinno w jednej
_Borys_
Jak to robisz że tak samo wychodzi, podaj kod ?
miras
Tam jest raczej dobrze wszystko, bo pod ten kod podpięte jest wyświetlanie tych danych na podstronie i jest wszystko.. ale podam kod:


najpierw kontroler:

  1. $this->data['options'] = array();
  2.  
  3. $xtab=array();
  4. $xtab = explode(",",$this->tab);
  5.  
  6. for($ii = 0; $ii < count($xtab); $ii++) {
  7. foreach ($this->model_catalog_product->getProductOptions($xtab[$ii]) as $option) {
  8.  
  9. if ($option['type'] == 'select' || $option['type'] == 'radio' || $option['type'] == 'checkbox' || $option['type'] == 'image') {
  10. $option_value_data = array();
  11.  
  12. foreach ($option['option_value'] as $option_value) {
  13. if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) {
  14. if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) {
  15. $price = $this->currency->format($this->tax->calculate($option_value['price'], $product_info['tax_class_id'], $this->config->get('config_tax')));
  16. } else {
  17. $price = false;
  18. }
  19.  
  20. $option_value_data[] = array(
  21. 'product_option_value_id' => $option_value['product_option_value_id'],
  22. 'option_value_id' => $option_value['option_value_id'],
  23. 'name' => $option_value['name'],
  24. 'image' => $this->model_tool_image->resize($option_value['image'], 50, 50),
  25. 'price' => $price,
  26. 'price_prefix' => $option_value['price_prefix']
  27. );
  28. }
  29. }
  30.  
  31. $this->data['options'][] = array(
  32. 'product_option_id' => $option['product_option_id'],
  33. 'option_id' => $option['option_id'],
  34. 'name' => $option['name'],
  35. 'type' => $option['type'],
  36. 'option_value' => $option_value_data,
  37. 'required' => $option['required']
  38. );
  39. } elseif ($option['type'] == 'text' || $option['type'] == 'textarea' || $option['type'] == 'file' || $option['type'] == 'date' || $option['type'] == 'datetime' || $option['type'] == 'time') {
  40. $this->data['options'][] = array(
  41. 'product_option_id' => $option['product_option_id'],
  42. 'option_id' => $option['option_id'],
  43. 'name' => $option['name'],
  44. 'type' => $option['type'],
  45. 'option_value' => $option['option_value'],
  46. 'required' => $option['required']
  47. );
  48. }
  49. }
  50. }



widok:


http://wklej.org/id/1195397/
_Borys_
Wyświetla to samo dwa razy ?
miras
no tak właśnie.. a z bazy powinien się jeden wyświetlać..
_Borys_
To pewnie gdzie indziej błąd. A od czego zależy, żeby raz wyświetlało ?
W tablicy masz dwie wartości, pętla for() przelatuje dwa razy czyli wyświetla dwa razy, może złe dane masz w tablicy.
Zakomentuj for(){} i ręcznie wpisz indeksy w foreach()
Raz:
  1. foreach ($this->model_catalog_product->getProductOptions(51) as $option)

Potem drugi raz:
  1. foreach ($this->model_catalog_product->getProductOptions(52) as $option)

Jak wyświetli za każdym razem to szukaj błędu w innym miejscu.
miras
mam je dać jedna w drugiej? bo jak dalem pod soba dwa kawalki kodu z tymi pętlami to zrobiło mi się teraz podwójnie na każdej pozycji..

Może jakoś czyścić te dane z pętli czy coś za każdym obrotem?
_Borys_
Nie nie, chodziło mi żeby uruchomić dwa razy, najpierw z pierwszym potem z drugim.
Skoro raz ma być wyświetlane to dlaczego podajesz w tablicy kilka wartości ?
miras
bo jest cos takiego - te ID to jest id zdjecia, do którego są wyświetlane 2 dane rok i model i podaje ID do wszystkich obrazkow nawet jak nie maja uzupelnionego pola model i rok byłby pusty to w widoku nie powinno tego przepuścić i nic nie wyświetlać.
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.