2009-11-07 2 views
1

Как я могу itarate этот массивИтерация через массивы в массивах PHP

array(2) { 
    [0]=> 
    array(1) { 
    [0]=> 
    array(14) { 
     [0]=> 
     string(17) "[email protected]" 
     [1]=> 
     string(23) "alokkumar.censored" 
     [2]=> 
     string(24) "[email protected]" 
     [3]=> 
     string(23) "[email protected]" 
     [4]=> 
     string(24) "[email protected]" 
     [5]=> 
     string(17) "[email protected]" 
     [6]=> 
     string(22) "[email protected]" 
     [7]=> 
     string(25) "[email protected]" 
     [8]=> 
     string(21) "[email protected]" 
     [9]=> 
     string(32) "[email protected]" 
     [10]=> 
     string(25) "[email protected]" 
     [11]=> 
     string(28) "[email protected]" 
     [12]=> 
     string(17) "[email protected]" 
     [13]=> 
     string(22) "[email protected]" 
    } 
    } 
    [1]=> 
    array(1) { 
    [0]=> 
    array(14) { 
     [0]=> 
     string(17) "[email protected]" 
     [1]=> 
     string(23) "[email protected]" 
     [2]=> 
     string(24) "[email protected]" 
     [3]=> 
     string(23) "[email protected]" 
     [4]=> 
     string(24) "[email protected]" 
     [5]=> 
     string(17) "[email protected]" 
     [6]=> 
     string(22) "[email protected]" 
     [7]=> 
     string(25) "[email protected]" 
     [8]=> 
     string(21) "[email protected]" 
     [9]=> 
     string(32) "[email protected]" 
     [10]=> 
     string(25) "[email protected]" 
     [11]=> 
     string(28) "[email protected]" 
     [12]=> 
     string(17) "[email protected]" 
     [13]=> 
     string(22) "[email protected]" 
    } 
    } 
} 
+3

mmmmmmm emails. –

+4

Я был бы сумасшедшим, если бы один из них был моим электронным письмом ... – gnarf

+0

Я добавил цензуру к адресам – streetparade

ответ

7

Вы можете использовать foreach внутри другого foreach:

foreach ($array as $item) { 
    foreach ($item[0] as $email) { 
     // … 
    } 
} 

Обратите внимание, что я использовал $item[0] вместо просто $item.

Вы также можете использовать функцию для выравнивания, что многомерный массив, а затем ireate его с одним foreach:

function array_flatten($array) { 
    if (!is_array($array)) { 
     return false; 
    } 
    $result = array(); 
    $stack = $array; 
    $len = count($stack); 
    while ($len) { 
     $val = array_shift($stack); 
     --$len; 
     if (is_array($val)) { 
      foreach ($val as $key => $val) { 
       if (is_array($val)) { 
        array_unshift($stack, $val); 
        ++$len; 
       } else { 
        $result[] = $val; 
       } 
      } 
     } else { 
      $result[] = $val; 
     } 
    } 
    return $result; 
} 
+0

Существует 2 уровня вложенности, поэтому это не сработает. – danieltalsky

+3

@danieltalsky: Обратите внимание, что я использовал '$ item [0]'. – Gumbo

+0

отмечено. Извини за это. это не позволит мне изменить мой голос ... вы можете отредактировать и сделать это яснее подателю – danieltalsky

0

Ну, что у вас здесь есть массив из двух элементов, где каждый элемент содержит один -элементный массив, содержащий массивы, которые вы хотите перебрать.

// This gets us the two seperate arrays 
foreach ($root_array as $2nd_level_array) { 

    // But now, we still have one more one-element array in each... 
    // we could iterate, but since there's only one element, 
    // we can just grab that element using array_pop() 
    $email_address_array = array_pop($2nd_level_array) 

    // now we can iterate over each of the two lists 
    foreach ($email_address_array as $email_address) { 

    // process email address 

    } 

} 
1

Может быть, немного более гибким решением Рекурсия:

<?php 

$a = array(); 
$a[] = array(array("a", "b")); 
$a[] = array(array(array("c", "d"), array("e", "f"), array("g", "h"))); 


print_arr($a); 

function print_arr($obj) { 
    foreach($obj as $k => $v) { 
     if(is_array($v)) { 
      print_arr($v); 
     }else{ 
      echo $v ."<br />"; 
     } 
    } 
} 

Бесполезный факт: моя первой рекурсивной функция, которая не имеет остановку состояния, но пойти состояния.

0

Вопрос не слишком конкретен в том, как итерации массива, и поскольку это многомерный массив, есть несколько способов сделать это.

Ниже я очерчу два пути, которые я вижу, будет иметь для меня наибольший смысл.

Прежде всего, я путешествую по массиву, перечисляя элементы последовательно.

Во второй попытке я прохожу через массив, группируя предметы второго уровня в соответствии с ключом.

$a = array(
    0 => array(
    0 => array(
     0 => "test0-0-0", 
     1 => "test0-0-1" 
    ) 
    ), 
    1 => array(
    0 => array(
     0 => "test1-0-0", 
     1 => "test1-0-1" 
    ) 
    ) 
); 

echo "Method 1\n"; 
foreach ($a as $array) { 
    foreach ($array[0] as $item) { 
    echo "$item\n"; 
    } 
} 
echo "Method 2\n"; 
$a0 = $a[0][0]; 
$a1 = $a[1][0]; 
if (count($a0) == count($a1)) { 
    for ($i=0;$i<count($a0);++$i) { 
    echo $a0[$i]."\n"; 
    echo $a1[$i]."\n"; 
    } 
} 
5

Я хотел бы создать функцию и передать его в array_walk_recursive

function spam_someone($value, $key) 
{ 
    $email=$value; 
    send_evil_spam($email); 
} 

array_walk_recursive($people_to_spam, 'spam_someone'); 

В качестве альтернативы, вы можете использовать RecursiveIteratorIterator для итерации последовательно по RecursiveArrayIterator. Они плохо документированы, но я считаю, что код будет выглядеть следующим образом:

//iterate over the array using recursion as in les' answer (doesn't gain much) 
$array_iter=new RecursiveArrayIterator($people_to_spam); 

//Ahh, here we go, this will let us iterate over the leaves in a sequential manner 
$iter_iter=new RecursiveIteratorIterator($array_iter); 
foreach($iter_iter as $email) 
{ 
    send_evil_spam($email) 
} 

Я нахожу эти два решения, чтобы быть чистым и наиболее читаемым. Если массив только когда-либо будет на 3 уровня глубиной, хотя, я могу просто записать его. Если бы я не знал об этом, я бы просто написал свою собственную рекурсивную функцию, чтобы сделать это (как в ответе «les»).

+0

upvote для имен функций!:) – mkgrunder

+0

круто спасибо, PLS удалить спам дерьмо, им не один из них – streetparade

Смежные вопросы