Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Pętla foreach - przeskoczenie o dwa rekordy
Majkelo23
post 2.09.2014, 20:19:10
Post #1





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

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


Jak w pętli foreach() mogę "przeskoczyć" o dwa przeloty w przód? Chodzi mi o coś takiego jak continue, tyle że wywołane dwa razy pod rzad.

Próbowałem mniej więcej tak:

  1. $i = 0;
  2. $next = 0;
  3. foreach($tablica AS $key => $value)
  4. {
  5. $i++;
  6.  
  7. if ( $value == 0 )
  8. {
  9. $next = $i+1;
  10. continue;
  11. }
  12. else if ( $next == $i )
  13. {
  14. continue;
  15. }
  16. }


Ale to nie działa... Ewentualnie ratuje mnie zmiana konkretnej wartości dla danego klucza podczas wykonywania pętli foreach (wtedy powyższa opcja jest mi niepotrzebna), ale to też wydaje mi się małowykonalne:

  1. $tab = array('zielony' => 2, 'czerwony' => 4);
  2.  
  3. foreach($tab AS $key => $value)
  4. {
  5. $tab['czerwony'] = 0;
  6. }


To, owszem, zamieni wartość w tablicy, ale po wykonaniu pętli. Ja muszę to zrobić w trakcie.
Ma kotś jakiś pomysł?

Ten post edytował Majkelo23 2.09.2014, 20:21:02
Go to the top of the page
+Quote Post
Turson
post 2.09.2014, 20:24:56
Post #2





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

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


Czemu nie pętla for z $i = 2 ?
Go to the top of the page
+Quote Post
Majkelo23
post 2.09.2014, 20:27:17
Post #3





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

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


Bo to nie jest regularny przeskok o dwa pola w przód. To będzie się działo powiedzmy przy 3 wywołaniu i 14 (liczby podane losowo). Nie wiem tego, w którym momencie zajdzie potrzeba przeskoczenia w pętli o te dwa rekordy, wychodzi to wewnątrz pętli.
Go to the top of the page
+Quote Post
ctom
post 2.09.2014, 20:41:25
Post #4





Grupa: Zarejestrowani
Postów: 321
Pomógł: 55
Dołączył: 19.04.2009

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


kod na szybko więc przerób na swoje potrzeby

  1. $a = array(1,2,3,4,5,6,7,8,9,10);
  2.  
  3. $przeskok = 0;
  4. foreach($a as $k){
  5.  
  6. if ( $przeskok > 0 ) { $przeskok--; continue;}
  7.  
  8. if($k == 5) { $przeskok = 2;}
  9.  
  10. echo $k ,'<br>';
  11.  
  12.  
  13. }


--------------------
Polecam MyDevil hosting idealny dla deweloperów
Go to the top of the page
+Quote Post
kreatiff
post 2.09.2014, 20:57:25
Post #5





Grupa: Zarejestrowani
Postów: 324
Pomógł: 105
Dołączył: 7.08.2012

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


Cytat
Ewentualnie ratuje mnie zmiana konkretnej wartości dla danego klucza podczas wykonywania pętli foreach


  1. foreach($tab AS $key => &$value)
  2.  
  3. {
  4.  
  5. if ( $key == 'czerwony' ) $value = 0;
  6.  
  7. }
  8. unset($value);
Zwróć uwagę na referencję & przed $value i jej usunięcie na końcu. Ten kod zmienia tablicę w locie, a nie działa na jej kopii.
Pewnie ArrayIterator też to idzie zrobić z podwójnym ->next()

Ten post edytował kreatiff 2.09.2014, 21:00:29
Go to the top of the page
+Quote Post
Majkelo23
post 2.09.2014, 21:09:48
Post #6





Grupa: Zarejestrowani
Postów: 226
Pomógł: 17
Dołączył: 13.02.2012

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


Niestety kurczę, nie działa mi to @kreatiff.
Natomiast @ctom - ta opcja jednak mnie nie ratuje, aczkolwiek działa, przepraszam za wprowadzenie w błąd.

Może pokażę kod i ktoś mi coś podsunie...

  1. function prepare_army_to_farm($village_id)
  2. {
  3. global $server, $farm_cap, $farm_army_info;
  4.  
  5. $available_army = get_village_army($village_id);
  6. $all_farm_cap = 0;
  7.  
  8. if ( $available_army === FALSE )
  9. {
  10. return FALSE;
  11. }
  12.  
  13. foreach($available_army AS $name_army => $available)
  14. {
  15. if ( array_key_exists($name_army, $farm_army_info) )
  16. {
  17. $army_cap = $farm_army_info[$name_army]['cap'];
  18. $all_farm_cap = $all_farm_cap+$army_cap*$available;
  19. }
  20. }
  21.  
  22. $count_all_attacks = ceil($all_farm_cap/$farm_cap);
  23.  
  24. $army_to_farm = array();
  25. $final_array = array();
  26. $n = 0;
  27. for($i=0; $i<=$count_all_attacks-1; $i++)
  28. {
  29. foreach($available_army AS $name_army => &$available)
  30. {
  31. if ( $available == 0 || !array_key_exists($name_army, $farm_army_info) )
  32. {
  33. continue;
  34. }
  35. else
  36. {
  37. $army_cap = $farm_army_info[$name_army]['cap'];
  38.  
  39. if ( (($farm_cap-$n) / $army_cap) > $available )
  40. {
  41. $army_to_farm[$name_army] = $available;
  42. if ( $available_army[$name_army]-$available == 0 )
  43. {
  44. $available = 0;
  45. }
  46. $n = $n+($available*$army_cap);
  47. }
  48. else if ( (($farm_cap-$n) / $army_cap) == $available )
  49. {
  50. $army_to_farm[$name_army] = $available;
  51. $available_army[$name_army] = $available_army[$name_army]-$available;
  52. break;
  53. }
  54. else if ( (($farm_cap-$n) / $army_cap) < $available )
  55. {
  56. $need_army = round(($farm_cap-$n)/$army_cap);
  57.  
  58. $army_to_farm[$name_army] = $need_army;
  59. $available_army[$name_army] = $available_army[$name_army]-$need_army;
  60. break;
  61. }
  62. }
  63. }
  64. $final_array[] = $army_to_farm;
  65. }
  66. return $final_array;
  67. }
  68. unset($available);


Problem jest w linii ~42. Jak widać, wszystkie warunki mają break, więc aktualizacja tablicy pomaga bo następny przelot bierze już pod uwagę fakt, że zmieniłem wartości w tablicy. Warunek w okolicy linii ~42 jednak nie jest kończony za pomocą break i tam jest problem. Chcę, aby gdy $available - $available wynosi 0, skrypt przeszedł do następnego rekordu. Jednak po przejściu do następnego rekordu, skrypt się zapętla po prostu i stoję w miejscu przez wszystkie przeloty pętli...

Tutaj jest wynik tego kodu powyższego:


Cytat
array(5) {
[0]=>
array(1) {
["spear"]=>
float(12)
}
[1]=>
array(1) {
["spear"]=>
float(12)
}
[2]=>
array(3) {
["spear"]=>
float(7)
["sword"]=>
string(1) "7"
["axe"]=>
float(30)
}
[3]=>
array(3) {
["spear"]=>
float(7)
["sword"]=>
string(1) "7"
["axe"]=>
float(30)
}
[4]=>
array(3) {
["spear"]=>
float(7)
["sword"]=>
string(1) "7"
["axe"]=>
float(2)
}
}


Jak widać 2 tablica przyjęła jakieś tam wartości i reszta się powtarza bo linia ~42 nie potrafi zatrybić, że tam jest po prostu 0, dla niej co przelot ta wartość wynosi 7 i skrypt stoi w miejscu zamiast gnać dalej. Nie mam pomysłu już jak to zrobić.
@UP Twoja propozycja mi nie działa, gdyby działała to przypuszczalnie by to poszło bo wtedy daję znać do skryptu, że ta wartość nie wynosi 7, tylko 0 i wtedy ten warunek z linii 31 zrobi swoje dalej.
Go to the top of the page
+Quote Post
zielu001
post 2.09.2014, 21:25:47
Post #7





Grupa: Zarejestrowani
Postów: 87
Pomógł: 3
Dołączył: 15.08.2009

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


  1. $tablica = array('Kubuś','Puchatek','Robi','Sukienki');
  2. $pomin = 2;
  3. foreach (new LimitIterator(new ArrayIterator($tablica), $pomin) as $e)
  4. {
  5. echo "$e\n";
  6. }
  7. output:
  8. robi
  9. sukienki



--------------------
"Zło do triumfu potrzebuje tylko tego, aby dobrzy ludzie nic nie robili"
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 16.05.2025 - 11:00