Eval的妙用

引用:http://www.phpchina.com/bbs/thread-25541-1-15.html

 

这里面用eval来把数组元素按点存储,从而实现无限分级效果

 

  1. class m_layer {
  2.     /**
  3.      * 无限分类
  4.      *
  5.      * @param object $mdb
  6.      * @param string $table
  7.      * @param string $label_colum
  8.      * @return array
  9.      */
  10.     function get_layer($layer$label_colum = 'label') {
  11.         $new_layer = array();
  12.         if (!is_array($layer) || !is_array(current($layer)) || !array_key_exists($label_colum, current($layer))) {
  13.             return array();
  14.         }
  15.         foreach ($layer as $row) {
  16.             $row_str = '';
  17.             foreach ($row as $key => $value) {
  18.                 $row_str .= ",'$key' => '$value'";
  19.             }
  20.             $row_str = "array(" . substr($row_str, 1) . ')';
  21.             $label_arr = explode('-'$row[$label_colum]);
  22.             $layer_str = '$new_layer';
  23.             foreach ($label_arr as $label) {
  24.                 if (intval($label)) {
  25.                     $layer_str .= "['child']['$label']";
  26.                 }
  27.             }
  28.          
  29.             eval("$layer_str=$row_str;echo strip_tags(/"/$layer_str=/$row_str/");");
  30.             echo '<br />';
  31.         }
  32.         return $new_layer['child'];
  33.     }
  34.     /**
  35.      * 获取new layer 相当于 mysql_insert_id 的用法
  36.      *
  37.      * @param object $mdb
  38.      * @param string $table
  39.      * @param string $father_label
  40.      * @param string $label_colum
  41.      * @return array
  42.      */
  43.     function get_new_layer($mdb$table$father_label$label_colum = 'label') {
  44.         $count = $father_label ? count(explode('-'$father_label)) : 0;
  45.         $size = strlen($father_label);
  46.         $sql = "SELECT $label_colum FROM $table WHERE LEFT($label_colum, $size) = '$father_label' ORDER BY $label_colum DESC";
  47.         $rs = $mdb->fetch_row($sql);
  48.         $last_label_arr = explode('-'$rs[$label_colum]);
  49.         $last_label = '';
  50.         for ($i = 0; $i <= $count$i++) {
  51.             $last_label .= '-' . $last_label_arr[$i];
  52.         }
  53.         $last_label = substr($last_label, 1);
  54.         $new_label = explode('-'$last_label);
  55.         $num = array_pop($new_label);
  56.         $new_label = implode('-'$new_label) . '-' . ++$num;
  57.         return $new_label;
  58.     }
  59. }
  60. $label[] = array('name' => '游戏世家''layer' => '01');
  61. $label[] = array('name' => '网络游戏''layer' => '01-01');
  62. $label[] = array('name' => '卡丁车''layer' => '01-01-01');
  63. $label[] = array('name' => '泡泡堂''layer' => '01-01-02');
  64. $label[] = array('name' => '单机游戏''layer' => '01-02');
  65. $label[] = array('name' => '生化危机''layer' => '01-02-01');
  66. $label[] = array('name' => '盟军敢死队''layer' => '01-02-02');
  67. $label[] = array('name' => '超级玛丽''layer' => '01-02-02');
  68. $label[] = array('name' => '娱乐休闲''layer' => '02');
  69. $label[] = array('name' => '音乐之家''layer' => '02-01');
  70. $label[] = array('name' => '周杰伦''layer' => '02-01-01');
  71. $label[] = array('name' => '刘若英''layer' => '02-01-02');
  72. $label[] = array('name' => '书香门第''layer' => '02-02');
  73. $label[] = array('name' => '小说''layer' => '02-02-01');
  74. $label[] = array('name' => '长篇小说''layer' => '02-02-01-01');
  75. $label[] = array('name' => '短篇小说''layer' => '02-02-01-02');
  76. $label[] = array('name' => '杂志''layer' => '02-02-02');
  77. $layeray = m_layer::get_layer($label'layer');
  78. print_r($layeray);
  79. ?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值