2010-03-31 18 views
6

Językiem jest PHP. Mam jedno foreach ($ a jako $ b) i inne foreach ($ c jako $ d => $ e). Jak je połączyć, aby odczytać jako jeden. Zmęczony foreach (($ a as $ b) & & ($ c as $ d => $ e)), ale to jest śmieci.Jak połączyć dwie pętle foreach w jeden

Odpowiedz

0

To zrobi, co chcesz, myślę. Będzie to postęp zarówno w przypadku macierzy w tym samym czasie w całej pętli. Można zawsze break ręcznie jeśli $c ma inny rozmiar niż $a i trzeba łamanie logiki na podstawie rozmiaru tablicy:

foreach($a as $b) 
{ 
    list($d,$e) = each($c); 
    //continue on with $b, $d and $e all set 
} 

each() przesunie wskaźnik tablicy $c na każdej iteracji.

3

Nie rozumiem, co próbujesz zrobić. Jeśli chcesz dotrzeć do nich jedna po drugiej po prostu korzystać z dwóch pętli:

foreach ($a as $b) { ... } 
foreach ($c as $d => $e) { ... } 

jeśli chcesz wszystkie kombinacje z $a i $c:

foreach ($a as $b) { 
    foreach ($c as $d => $e) { 
    // do stuff 
    } 
} 

Myślę, że można zrobić coś takiego:

foreach (array_merge($a, $c) as $k => $v) { 
    ... 
} 

ale nie koniecznie by to doradziłem.

22

Możesz być zainteresowany SPL's MultipleIterator

np

// ArrayIterator is just an example, could be any Iterator. 
$a1 = new ArrayIterator(array(1, 2, 3, 4, 5, 6)); 
$a2 = new ArrayIterator(array(11, 12, 13, 14, 15, 16)); 

$it = new MultipleIterator; 
$it->attachIterator($a1); 
$it->attachIterator($a2); 

foreach($it as $e) { 
    echo $e[0], ' | ', $e[1], "\n"; 
} 

drukuje

1 | 11 
2 | 12 
3 | 13 
4 | 14 
5 | 15 
6 | 16 
+0

To najciekawszy pokój kodu widziałem dzisiaj. Plus jeden za to. Czy tablice MUSZĄ być jednakowej długości, czy też zatrzymujesz iterację tylko na jednym z nich? –

+3

To zależy od tego, czy ustawisz flagę MultipleIterator :: MIT_NEED_ANY, czy MultipleIterator :: MIT_NEED_ALL. Przy MIT_NEED_ALL iterator zatrzymuje się, jeśli któryś z wewnętrznych iteratorów nie ma już żadnych elementów. W MIT_NEED_ANY iterator trwa tak długo, jak przynajmniej jeden wewnętrzny iterator ma inny element, wszystkie inne elementy stają się NULL. MIT_NEED_ALL jest domyślnie. – VolkerK

+1

Dziękuję za informacje, bardzo fajne! –

7

1) Pierwsza metoda

<?php 
$FirstArray = array('a', 'b', 'c', 'd'); 
$SecondArray = array('1', '2', '3', '4'); 

foreach(array_combine($FirstArray, $SecondArray) as $f => $n) { 
    echo $f.$n; 
    echo "<br/>"; 
} 
?> 

lub 2) Druga metoda

<?php 
$FirstArray = array('a', 'b', 'c', 'd'); 
$SecondArray = array('1', '2', '3', '4'); 

for ($index = 0 ; $index < count($FirstArray); $index ++) { 
    echo $FirstArray[$index] . $SecondArray[$index]; 
    echo "<br/>"; 
} 
?> 
Powiązane problemy