Рубрики
Uncategorized

Пример анализа статических переменных в функции PHP

Автор оригинала: David Wong.

В этой статье описывается использование статических переменных в функциях PHP с примерами. Подробности заключаются в следующем:

php
function msg() {
  static $a = 0;
  echo $a++, '
'; } msg(); msg(); msg();

Приведенный выше код выводит 0, 1 и 2 статические переменные $a соответственно. После первого определения и инициализации он останется в памяти до тех пор, пока сценарий не будет выполнен.

Когда функция msg() вызывается во второй раз, значение $a равно 1 вместо 0.

Так вот в чем проблема. Пожалуйста, посмотрите на следующий код:

$data = array(
  Array ('id '= > 1,' title '= >'clothes','parent' = > 0),
  Array ('id '= > 2,' title '= >'shoes','parent' = > 0),
  Array ('id '= > 3,' title '= >'shirt','parent '= > 1),
  Array ('id '= > 4,' title '= >'t-shirt','parent '= > 1),
  Array ('id '= > 5,' title '= >'sneakers','parent' = > 2),
  Array ('id '= > 6,' title '= >'casual shoes','parent' = > 2),
);

$data2 = array(
  Array ('id '= > 1,' title '= >'food','parent '= > 0),
  Array ('id '= > 2,' title '= >'Meat','parent '= > 1),
  Array ('id '= > 3,' title '= >'vegetarian','parent '= > 1),
  Array ('id '= > 4,' title '= >'beef','parent '= > 2),
  Array ('id '= > 5,' title '= >'noodles','parent' = > 3),
  Array ('id '= > 6,' title '= >'steamed bread','parent '= > 3),
);

//Spanning tree data
function genTree($items, $id = 'id', $pid = 'parent', $son = 'child') {
  $tree = array();
  $tmpMap = array();

  foreach ($items as $item) {
    $tmpMap[$item[$id]] = $item;
  }
  foreach ($items as $item) {
    if (isset($tmpMap[$item[$pid]])) {
      $tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]];
    } else {
      $tree[] = &$tmpMap[$item[$id]];
    }
  }
  unset($tmpMap);
  return $tree;
}

//Through the given data, return the string of option for the select drop-down box
function getOpts($data, $idArr = array(), $level = 0, $son = 'child') {
  static $opt = '';
  if (!empty($data)) {
    foreach ($data as $k => $v) {
      $opt .= '';
      if (!empty($v[$son])) {
        getOpts($v[$son], $idArr, $level + 1, $son);
      }
    }
  }
  return $opt;
}

$data = genTree($data);
echo '';

$data2 = genTree($data2);
echo '';

Для решения вышеуказанных проблем не рекомендуется использовать статические переменные внутри функций, которые могут вызываться много раз.

Измените функцию getopts следующим образом, введите ссылку на внешнюю переменную из параметра функции, чтобы решить эту проблему.

function getOpts($data, $idArr = array(), &$opt = '', $level = 0, $son = 'child') {
  if (!empty($data)) {
    foreach ($data as $k => $v) {
      $opt .= '';
      if (!empty($v[$son])) {
        getOpts($v[$son], $idArr, $opt, $level + 1, $son);
      }
    }
  }
}

$data = genTree($data);
getOpts($data, array(), $opt);
echo '';

$data2 = genTree($data2);
getOpts($data2, array(), $opt2);
echo '';

Подробнее о содержании, связанном с PHP, заинтересованные читатели могут ознакомиться с нашими специальными разделами: краткое описание общих функций и навыков PHP, краткое описание использования строк PHP, полные навыки работы с массивом PHP, учебник по структуре и алгоритму данных PHP, а также краткое описание метода расчета программирования PHP

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