Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP]problem z Pętla foreach, jw
miras
post
Post #1





Grupa: Zarejestrowani
Postów: 1 004
Pomógł: 9
Dołączył: 18.01.2011
Skąd: Siedlce

Ostrzeżenie: (30%)
XX---


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. }
Go to the top of the page
+Quote Post
Michael2318
post
Post #2





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

Ostrzeżenie: (0%)
-----


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. }



Ten post edytował Michael2318 2.12.2013, 19:47:35
Go to the top of the page
+Quote Post
_Borys_
post
Post #3





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


Wewnątrz foreach() zwiększanie nic nie da, niech doda pętlę for() przed foreach() na podstawie count($this->xtab)
Go to the top of the page
+Quote Post
Michael2318
post
Post #4





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

Ostrzeżenie: (0%)
-----


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. }
Go to the top of the page
+Quote Post
miras
post
Post #5





Grupa: Zarejestrowani
Postów: 1 004
Pomógł: 9
Dołączył: 18.01.2011
Skąd: Siedlce

Ostrzeżenie: (30%)
XX---


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

Ten post edytował miras 2.12.2013, 20:25:28
Go to the top of the page
+Quote Post
Michael2318
post
Post #6





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

Ostrzeżenie: (0%)
-----


Pokaż cały ten kod, który Ci nie działa (jak go zedytowałeś).
Go to the top of the page
+Quote Post
miras
post
Post #7





Grupa: Zarejestrowani
Postów: 1 004
Pomógł: 9
Dołączył: 18.01.2011
Skąd: Siedlce

Ostrzeżenie: (30%)
XX---


  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) {
Go to the top of the page
+Quote Post
Michael2318
post
Post #8





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

Ostrzeżenie: (0%)
-----


A co w ogóle zwraca Ci count($xtab) ?
Go to the top of the page
+Quote Post
miras
post
Post #9





Grupa: Zarejestrowani
Postów: 1 004
Pomógł: 9
Dołączył: 18.01.2011
Skąd: Siedlce

Ostrzeżenie: (30%)
XX---


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..
Go to the top of the page
+Quote Post
Turson
post
Post #10





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


print_r($xtab) i wyjdzie szydło z worka
Go to the top of the page
+Quote Post
miras
post
Post #11





Grupa: Zarejestrowani
Postów: 1 004
Pomógł: 9
Dołączył: 18.01.2011
Skąd: Siedlce

Ostrzeżenie: (30%)
XX---


Array ( [0] => [1] => 51 [2] => 52 [3] => 51 [4] => 52 ) to mi zwróciło
Go to the top of the page
+Quote Post
_Borys_
post
Post #12





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


Skoro wartości się powtarzają to i w foreach() się powtarza to samo. Poza tym masz pewnie przecinek na początku $this->tab
Go to the top of the page
+Quote Post
miras
post
Post #13





Grupa: Zarejestrowani
Postów: 1 004
Pomógł: 9
Dołączył: 18.01.2011
Skąd: Siedlce

Ostrzeżenie: (30%)
XX---


a jak się nazywała funkcja usuwająca powtarzające się i puste rekordy ?

Ten post edytował miras 2.12.2013, 22:15:26
Go to the top of the page
+Quote Post
_Borys_
post
Post #14





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


$xtab = array_values(array_filter(array_unique($xtab)));
pierwsza przypisuje nowe klucze kolejno, druga usuwa puste, trzecia zwraca unikalne (IMG:style_emoticons/default/wink.gif)

Ten post edytował _Borys_ 2.12.2013, 22:35:02
Go to the top of the page
+Quote Post
miras
post
Post #15





Grupa: Zarejestrowani
Postów: 1 004
Pomógł: 9
Dołączył: 18.01.2011
Skąd: Siedlce

Ostrzeżenie: (30%)
XX---


  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
Go to the top of the page
+Quote Post
_Borys_
post
Post #16





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


Jak to robisz że tak samo wychodzi, podaj kod ?
Go to the top of the page
+Quote Post
miras
post
Post #17





Grupa: Zarejestrowani
Postów: 1 004
Pomógł: 9
Dołączył: 18.01.2011
Skąd: Siedlce

Ostrzeżenie: (30%)
XX---


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/
Go to the top of the page
+Quote Post
_Borys_
post
Post #18





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


Wyświetla to samo dwa razy ?
Go to the top of the page
+Quote Post
miras
post
Post #19





Grupa: Zarejestrowani
Postów: 1 004
Pomógł: 9
Dołączył: 18.01.2011
Skąd: Siedlce

Ostrzeżenie: (30%)
XX---


no tak właśnie.. a z bazy powinien się jeden wyświetlać..
Go to the top of the page
+Quote Post
_Borys_
post
Post #20





Grupa: Zarejestrowani
Postów: 587
Pomógł: 190
Dołączył: 5.02.2011
Skąd: 64-800

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 00:31