2015-09-19 2 views
0

Первое предположение: предположим, мы определили переменную (ее имя - $ tmp) в функции (имя функции - ExpMenu) для временного вычисления, а в конце функции мы возвращаем эту переменную.PHP - переменная область в рекурсивно функции

Второе предположение. Предположим, мы вызываем эту функцию рекурсивно для создания базы меню навигации на многомерном массиве.

Мой вопрос касается области видимости этой переменной ($ tmp). В каждом вызове функция будет перезаписана? Другими словами, по каждому вызову функции мы теряем предыдущее значение?

Для более подробной информации, пожалуйста, ознакомьтесь ниже кода:

/// --- { Declaration Block 
$content = array(
    array(
     'level'=>'1', 
     'order'=>'1', 
     'text'=>'New Solution WorkFlow', 
     'is_parent'=>'yes', 
     'child'=> array(
      array(
       'level'=>'2', 
       'order'=>'1', 
       'text'=>'Define New Solution', 
       'is_parent'=>'no', 
       'url'=>'#' 
      ), 
      array(
       'level'=>'2', 
       'order'=>'2', 
       'text'=>'View Solutions', 
       'is_parent'=>'no', 
       'url'=>'#' 
      ), 
      array(
       'level'=>'2', 
       'order'=>'3', 
       'text'=>'View Solutions', 
       'is_parent'=>'no', 
       'url'=>'#' 
      ) 
     ) 
    ), 
    array(
     'level'=>'1', 
     'order'=>'2', 
     'text'=>'Solution Modify WorkFlow', 
     'is_parent'=>'yes', 
     'child'=> array(
      array(
       'level'=>'2', 
       'order'=>'1', 
       'text'=>'Request For Solution Modify', 
       'is_parent'=>'no', 
       'url'=>'#' 
      ) 
     ) 
    ), 
    array(
     'level'=>'1', 
     'order'=>'3', 
     'text'=>'Solution Close WorkFlow', 
     'is_parent'=>'yes', 
     'child'=> array(
      array(
       'level'=>'2', 
       'order'=>'1', 
       'text'=>'Declare For Solution Close', 
       'is_parent'=>'no', 
       'url'=>'#' 
      ) 
     ) 
    ) 
); 

function ExpMenu($item_array) { 

    $tmp=''; 
    foreach ($item_array as $item) { 
     if ($item['is_parent']=='yes') { 
      $tmp = '<li class="hasChild">' . $item["text"] . '<ul>'; 
      $tmp .= ExpMenu($item['child']); 
      $tmp .= '</ul></li>'; 
     } else { 
      $tmp = '<li>'; 
      $tmp .= '<a href="' . $item['url'] . '">'. $item['text'] . '</a>' ; 
      $tmp .= '</li>'; 
     } 
    } 
    return $tmp; 

} 
/// --- } 

$menu='<div><ul>'; 
$menu .= ExpMenu($content); 
$menu.='</ul></div>'; 


echo $m . '<br />'; 

ответ

0

Я предполагаю, что фактическая проблема в том, что ваша функция генерирует только один элемент с одним дочерним элементом.

Это потому, что вы переписываете свой предыдущий элемент в блоки if/else. Вот почему вы получаете только последний предмет.
Вам просто нужно объединить их с существующими элементами.

function ExpMenu($item_array) { 

    $tmp=''; 
    foreach ($item_array as $item) { 
     if ($item['is_parent']=='yes') { 
      $tmp .= '<li class="hasChild">' . $item["text"] . '<ul>'; 
      $tmp .= ExpMenu($item['child']); 
      $tmp .= '</ul></li>'; 
     } else { 
      $tmp .= '<li>'; 
      $tmp .= '<a href="' . $item['url'] . '">'. $item['text'] . '</a>' ; 
      $tmp .= '</li>'; 
     } 
    } 
    return $tmp; 

} 
+0

Спасибо [@gre_gor] (http://stackoverflow.com/users/794749/gre-gor). Вы точно обнаружили мою фактическую проблему. Но мой вопрос касается области переменных в рекурсивных функциях. Самое интересное, что мы с тобой нашли тот же ответ. –

2

Он швыет каждую функцию вызова, мы теряем проницаемое значение.

Я благодарю @l0rkaY за решение ее, но я нашел другое решение, которое не нуждается в добавлении нового параметра в мою функцию.

Поскольку $ tmp scope находится в функции «ExpMenu», и мы вызываем рекурсивно функцию, поэтому переменная все еще жива и не была прервана.

Итак, я изменяю моя функция немного:

function ExpMenu($item_array) { 

    $tmp=''; 
    foreach ($item_array as $item) { 
     if ($item['is_parent']=='yes') { 
      $tmp .= '<li class="hasChild">' . $item["text"] . '<ul>'; 
      $tmp .= ExpMenu($item['child']); 
      $tmp .= '</ul></li>'; 
     } else { 
      $tmp .= '<li>'; 
      $tmp .= '<a href="' . $item['url'] . '">'. $item['text'] . '</a>' ; 
      $tmp .= '</li>'; 
     } 
    } 
    return $tmp; 

} 
+1

* «Шлейф каждой функцией вызова мы теряем предыдущее значение». * - каждый вызов функции имеет свой собственный набор локальных переменных; ничего не потеряно, ничего не перезаписывается. Игнорируйте повторение, подумайте о внутреннем вызове как о другой операции, которая возвращает строку. Каждый вызов функции создает локальную переменную '$ tmp' (отличную от' $ tmp' других вызовов), добавляет к ней некоторые строки, а затем возвращает ее. Проблема в вашем первоначальном вызове ** не связана с повторением **. Первые присваивания в блоках 'if' и' else' сбрасывают значение '$ tmp' на каждой итерации. – axiac

+0

[@axiac] (http://stackoverflow.com/users/4265352/axiac) прямо с вами. Проблема, связанная с первыми присваиваниями, что, модифицируя код, как указано выше, будет решаться. –

+0

[@axiac] (http://stackoverflow.com/users/4265352/axiac), пожалуйста, отправьте свой ответ > («Каждый вызов функции создает локальную переменную $ tmp (отличную от $ tmp других вызовов), добавляет некоторые строки к нему затем возвращают ») пока я не могу принять его –

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