用PHP解析XML为数组的方法

XML——可扩展标记语言 。

可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。

它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

PHP5已经内置的用于解析XML的函数,但使用起来并不顺手,于是就有了下面这段代码:

<?php
function xmlToArray($xml) {
    $array = (array)(simplexml_load_file($xml, null, LIBXML_NOCDATA));
    foreach ($array as $key => $value) {
        $array[$key] = structToArray((array)$value);
    }
    return $array;
}

function structToArray($item) {
    if (!is_string($item)) {
        $item = (array)$item;
        foreach ($item as $key => $value) {
            $item[$key] = structToArray($value);
        }
    }
    return $item;
}

$file ="test.xml";
$arrXml = xmlToArray($file);
print_r($arrXml);
?>

 

一段经典的抽奖算法 for PHP版

首先,我们构造一个奖项数组:

<?php
$prize_arr = array(
    array('id'=>1, 'prize'=>'No.1', 'v'=>1),
    array('id'=>2, 'prize'=>'No.2', 'v'=>3),
    array('id'=>3, 'prize'=>'No.3', 'v'=>6),
    array('id'=>4, 'prize'=>'No.4', 'v'=>10),
    array('id'=>5, 'prize'=>'No.5', 'v'=>20),
    array('id'=>6, 'prize'=>'Sorry', 'v'=>60),
);
?>

上面的数组中,No.1代表1等奖,以此类推,No.5代表5等奖,而Sorry代表没有中奖。v代表概率。

继续,我们看看算法的代码:

<?php
function get_rand($proArr) {
    $result = '';
    //概率数组的总概率精度
    $proSum = array_sum($proArr);
    //概率数组循环
    foreach ($proArr as $key => $proCur) {
        $randNum = mt_rand(1, $proSum);
        if ($randNum <= $proCur) {
            $result = $key;
            break;
        } else {
            $proSum -= $proCur;
        }
    }
    unset($proArr);
    return $result;
}
?>

上面的代码从1等奖开始,根据概率逐一计算每个奖项是否中出,直至最后没有中奖。

究竟这个算法是否准确,我们来模拟一下:

<?php
//通过奖项数组,构造出一个用于抽奖的概率数组
foreach ($prize_arr as $key => $val) {
    $arr[$key] = $val['v'];
}

//模拟1万次抽奖
for ($i=1; $i<=10000; $i++) {
    $prize_key = get_rand($arr);
    if (isset($test[$prize_arr[$prize_key]['prize']])) {
        $test[$prize_arr[$prize_key]['prize']]++;
    } else {
        $test[$prize_arr[$prize_key]['prize']] = 1;
    }
}
print_r($test);
?>

上面代码的模拟结果输出:

Array
(
    [sorry] => 6017
    [No.5] => 2011
    [No.4] => 968
    [No.3] => 587
    [No.2] => 310
    [No.1] => 107
)

通过模拟结果可以看出,这个算法还是很靠谱的。

阳光部落原创,更多内容请访问http://www.sunbloger.com/