zoukankan      html  css  js  c++  java
  • php 函数中静态变量的问题

    <?php
    function msg() {
        static $a = 0;
        echo $a++, '<br />';
    }
    
    msg();
    msg();
    msg();
    
    上述代码,分别输出0,1,2 静态变量$a在第一次定义并初始化后就会常驻内存,直到脚本执行完毕。
    当第二次调用msg()函数时,这时的$a值为1,而不会变成0。
     
    那么问题来了,请看下面的一段代码:
    $data = array(
        array('id' => 1, 'title' => '衣服', 'parent' => 0),
        array('id' => 2, 'title' => '鞋子', 'parent' => 0),
        array('id' => 3, 'title' => '衬衫', 'parent' => 1),
        array('id' => 4, 'title' => 'T恤', 'parent' => 1),
        array('id' => 5, 'title' => '运动鞋', 'parent' => 2),
        array('id' => 6, 'title' => '休闲鞋', 'parent' => 2),
    );
    
    
    $data2 = array(
        array('id' => 1, 'title' => '食物', 'parent' => 0),
        array('id' => 2, 'title' => '肉食', 'parent' => 1),
        array('id' => 3, 'title' => '素食', 'parent' => 1),
        array('id' => 4, 'title' => '牛肉', 'parent' => 2),
        array('id' => 5, 'title' => '面条', 'parent' => 3),
        array('id' => 6, 'title' => '馒头', 'parent' => 3),
    );
    
    
    //生成树型数据
    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;
    }
    
    //通过给定数据,返回option的字符串,用于select下拉框
    function getOpts($data, $idArr = array(), $level = 0, $son = 'child') {
        static $opt = '';
        if (!empty($data)) {
            foreach ($data as $k => $v) {
                $opt .= '<option value=' . $v['id'] . (in_array($v['id'], $idArr) ? ' selected="true"' : '') . '>' . str_repeat(' ', $level * 3) . $v['title'] . '</option>';
                if (!empty($v[$son])) {
                    getOpts($v[$son], $idArr, $level + 1, $son);
                }
            }
        }
        return $opt;
    }
    
    $data = genTree($data);
    echo '<select>';
    //第一次调用getOpts时,没有任何问题。
    echo getOpts($data);
    echo '</select>';
    
    $data2 = genTree($data2);
    echo '<select>';
    //当第二次调用时,问题就出现了,还留有上次的数据
    echo getOpts($data2);
    echo '</select>';
    
    上述问题,对于可能多次调用的函数,不建议在内部使用静态变量。
    修改getOpts函数如下,从函数参数引入一个外部变量的引用,来解决此问题。
    function getOpts($data, $idArr = array(), &$opt = '', $level = 0, $son = 'child') {
        if (!empty($data)) {
            foreach ($data as $k => $v) {
                $opt .= '<option value=' . $v['id'] . (in_array($v['id'], $idArr) ? ' selected="true"' : '') . '>' . str_repeat(' ', $level * 3) . $v['title'] . '</option>';
                if (!empty($v[$son])) {
                    getOpts($v[$son], $idArr, $opt, $level + 1, $son);
                }
            }
        }
    }
    
    
    $data = genTree($data);
    getOpts($data, array(), $opt);
    echo '<select>';
    echo $opt;
    echo '</select>';
    
    $data2 = genTree($data2);
    getOpts($data2, array(), $opt2);
    echo '<select>';
    echo $opt2;
    echo '</select>';
    
  • 相关阅读:
    x64 平台开发 Mapxtreme 编译错误
    hdu 4305 Lightning
    Ural 1627 Join(生成树计数)
    poj 2104 Kth Number(可持久化线段树)
    ural 1651 Shortest Subchain
    hdu 4351 Digital root
    hdu 3221 Bruteforce Algorithm
    poj 2892 Tunnel Warfare (Splay Tree instead of Segment Tree)
    hdu 4031 Attack(BIT)
    LightOJ 1277 Looking for a Subsequence
  • 原文地址:https://www.cnblogs.com/jkko123/p/6294607.html
Copyright © 2011-2022 走看看