2013-08-25 2 views
0

У меня есть структура массива html.Возможно ли использовать цикл без использования foreach?

Я выводил этот массив с петлями foreach. (внутри функций get_output)

Можно ли выводить результаты без использования foreach?

$schema = array(
    array(
     'tag' => 'div', 
     'class' => 'lines', 
     array(
      'tag' => 'div', 
      array(
       'tag' => 'span', 
       'style' => 'margin:10px; padding:10px', 
       'key' => '$key-countryname', 
      ), 
      'key' => '$value-country', 
     ), 
     array(
      'tag' => 'div', 
      array(
       'tag' => 'span', 
       'style' => 'margin:10px; padding:10px', 
       'key' => '$key-countryname', 
      ), 
      'key' => '$value-country', 
     ), 
    ) 
); 

Моя функция использует Еогеасп петлю для вывода результатов

function get_output($schema, $t = -2){ 
    $t++; $tag = ""; $atts = array(); $keys = array(); $code = array(); 

    foreach($schema as $k => $v){   
     if(is_array($v)){ 
      $keys[] = get_output($v, $t); 
     } else { 
      switch($k){ 
       case "tag": $tag = $v; break; 
       case "key": $keys[] = $v; break; 
       case "type": break; 
       default: $atts[$k] = $v; break; 
      } 
     }  
    } 
    if(0 < $t){ $code[] = "\n".str_repeat("\t", $t); } 
    if($tag){ 
     $code[] = "<$tag"; foreach($atts as $k=>$v){ $code[] = ' '.$k.'="'.$v.'"'; } $code[] = ">"; 
     $code = array(implode('', $code)); 
    } 
    foreach($keys as $k){ $code[] = $k; } 
    if($tag){ 
     $code[] = "\n".str_repeat("\t", $t); 
     $code[] = '</'.$tag.'>'; 
    } 
    //print_r($code); 
    return implode("", $code); 
} 
+0

Да, используйте простой 'for' loop ...;) – alfasin

+0

' array_map() ',' array_walk() 'или, возможно, [' array_walk_recursive() '] (http://php.net/manual/en/ function.array-walk-recursive.php)? – HamZa

+0

@alfasin Я ищу встроенную функцию php, у которой есть внутренняя функция foreach. –

ответ

0

while и for совершенно правомерные пути к массиву петли:

$a = array(1,2,3); // indexed 
$b = array(
    'a' => 1, 
    'b' => 2, 
    'c' => 3 
); // associative 

echo '$a indexed with "for": <br />'; 
for ($i = 0; $i < count($a); $i++) { 
    echo $a[$i] . '<br />'; 
} 
echo '$a indexed with "while": <br />'; 
$i = 0; // reset counter 
while ($i < count($a)) { 
    echo $a[$i] . '<br />'; 
    $i++; 
} 

echo '$b assoc with "for": <br />'; 
for ($i = 0; $i < count($a); $i++) { 
    echo key($b) . ' => ' . current($b) . '<br />'; 
    next($b); // step forward 
} 
echo '$b assoc with "while": <br />'; 
reset($b); // rewind array cursor to start 
while ($value = current($b)) { 
    echo key($b) . ' => ' . $value . '<br />'; 
    next($b); // step forward 
} 

Кроме того, как вы уже реализованы в вашем втором коде фрагмент, многодисковый массив может быть закольцован с рекурсией (хотя по сравнению с вложенными циклами он потребляет больше памяти)

+0

Можно ли использовать функцию count для циклического многомерного массива? –

+0

@DenizPorsuk no, 'count()' только подсчитывает элементы на первом уровне, но, как указывает HamZa, вы можете использовать 'array_walk_recursive()' он должен быть эффективен, чем простая рекурсия. –

+0

Предположим, что для next() для простой сравнения используйте. Может возникнуть проблема с многомерным массивом. –

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