三、数组

1、基本内容

  • range(low,high,[step]);函数,创建一个包含指定范围的元素的数组。
    参数step:可选。规定元素之间的步进制。默认是 1。
    如:range(0,10,2);输出以2递增,到10结束的数组。
  • 循环输出数组内容
$price['a'] = 100; 
$price['b'] = 10; 
$price['c'] = 4;
1-foreach()方法
foreach ($price as $key=>$value){
        echo $key." - ".$value."<br />";
    }
2-each()方法
while($element = each($price)){
        echo $element['key'];
        echo " -- ";
        echo $element['value'];
        echo "<br />";
    }
3-list()方法
reset($price);
使用each()函数时,数组将记录当前元素,若要在相同的脚本中
多次使用该数组,应重置数组的指针到开始处
while(list($product,$pric) = each($price)){
        echo $product." - - ".$pric."<br />";
    }
list()可以重命名数组的key和value值,该函数只使用于数字索引的数组,且默认从0开始
  • 二维数组
$products = array(
            array('Code' => 'TIR',
                    'Desc' => 'Tires',
                    'Price' => 100
            ),
            array('Code' => 'OIL',
                    'Desc' => 'Oil',
                    'Price' => 10
            ),
            array('Code' => 'SPK',
                    'Desc' => 'Spark Plugs',
                    'Price' => 4
            ),
    );
    for($row=0; $row<3; $row++){
        while(list($key, $value) = each($products[$row])){
            echo " |$value";
        }
        echo " |<br />";
    }
输出:
|TIR |Tires |100 |
|OIL |Oil |10 |
|SPK |Spark Plugs |4 |
  • 数组排序(一维数组和多维数组)
  • 一维数组的一些排序函数
    1、适用于无关联的数组,如一维数字索引数组
$arr = array('Tir','Oil' ,'Spk' ,);
sort(arr,[sortingtype]); 函数对索引数组进行升序排序
如果成功则返回 TRUE,否则返回 FALSE
参数sortingtype:可选。规定如何比较数组的元素/项目
0 = SORT_REGULAR - 默认。把每一项按常规顺序排列
1 = SORT_NUMERIC - 把每一项作为数字来处理
2 = SORT_STRING - 把每一项作为字符串来处理。

2、适用于关联数组的排序如一维关联数组

$arr = array('Tir' => 100,'Oil' => 10,'Spk' => 4,);
asort();ksort();
若用关联数组存储各个项目和它们的价格,
就需要用不同的排序函数使关键字和值在排序时仍然保持一致。
asort();将数组的value值升序排序
ksort();将数组的key值升序排序

3、反向排序

对应于 sort(),asort(),ksort(),反向排序函数依次为
rsort(),arsort(),krsort(),使数组降序排序。
  • 多维数组排序usort()
usort();用例:
    $products = array(
            array('Code' => 'TIR',
                    'Desc' => 'Tires',
                    'Price' => 100
            ),
            array('Code' => 'OIL',
                    'Desc' => 'Oil',
                    'Price' => 10
            ),
            array('Code' => 'SPK',
                    'Desc' => 'Spark Plugs',
                    'Price' => 4
            ),
    );
    usort($products, "usortRank");
    function usortRank($a,$b){
        $a1 = $a['Price'];
        $b1 = $b['Price'];
        if($a1 == $b1){
            return 0;
        }
        return ($a1>$b1 ?  1:-1);
    }
    print_r($products);

类似于asort()和ksort()对应有uasort()和uksort()

  • 对数组进行重新排序
    shuffle()函数将数组次序随机打乱;
    array_reverse()给出一个原数组的反向排序
    array_push()函数将每个新元素添加到数组的末尾
    array_pop()函数删除并返回数组末尾的一个元素
  • explode()函数:将字符串打散为数组
explode(separator,string,limit);
*separator*必需。规定在哪里分割字符串。
*string*必需。要分割的字符串。
*limit*可选。规定所返回的数组元素的数目。
可能的值:
大于 0 - 返回包含最多 *limit* 个元素的数组
小于 0 - 返回包含除了最后的 -*limit* 个元素以外的所有元素的数组
0 - 返回包含一个元素的数组
如:
$str = 'one,two,three,four';
print_r(explode(',',$str));输出结果为:Array ( [0] => one [1] => two [2] => three [3] => four)
print_r(explode(',',$str,0));输出结果为:Array ( [0] => one,two,three,four )
print_r(explode(',',$str,2));输出结果为:Array ( [0] => one [1] => two,three,four )
print_r(explode(',',$str,-1));//返回不包含最后一个元素的数组
即 Array ( [0] => one [1] => two [2] => three )
  • 数组中浏览
each() 函数返回当前元素的键名和键值,并将内部指针向前移动
current() - 返回数组中的当前元素的值
end() - 将内部指针指向数组中的最后一个元素,并输出
next() - 将内部指针指向数组中的下一个元素,并输出
prev() - 将内部指针指向数组中的上一个元素,并输出
reset() - 将内部指针指向数组中的第一个元素,并输出
--
$arrTest = range(1, 10);
print_r(each($arrTest));
//Array ( [1] => 1 [value] => 1 [0] => 0 [key] => 0 )
--2
    $people = array("Bill", "Steve", "Mark", "David");
    reset($people);
    while (list($key, $val) = each($people)){
        echo "$key => $val<br>";
    }
--例子
    <?php
    $people = array("Bill", "Steve", "Mark", "David");
    echo current($people) . "<br>"; // 当前元素是 Bill
    echo next($people) . "<br>"; // Bill 的下一个元素是 Steve
    echo current($people) . "<br>"; // 现在当前元素是 Steve
    echo prev($people) . "<br>"; // Steve 的上一个元素是 Bill
    echo end($people) . "<br>"; // 最后一个元素是 David
    echo prev($people) . "<br>"; // David 之前的元素是 Mark
    echo current($people) . "<br>"; // 目前的当前元素是 Mark
    echo reset($people) . "<br>"; // 把内部指针移动到数组的首个元素,即 Bill
    echo next($people) . "<br>"; // Bill 的下一个元素是 Steve
    print_r (each($people)); // 返回当前元素的键名和键值(目前是 Steve),并向前移动内部指针
    ?>
  • array_walk($arr, $func, [userdata...])
    对数组中的元素运用自定义函数,在函数中,数组的键名和键值是参数
       $arrTest = range(1, 10);
    function my_print(&$value,$key,$factor){
        echo $value *= $factor;
        echo "<br />";
    }
    array_walk($arrTest, 'my_print', 3);
    echo "<hr/>";
    print_r($arrTest);
这里的&符号是引用传值,将数组的每个元素的值都乘以3。
  • extract($arr, $extract_rules, $prefix)
    该函数对数组键名作为变量名,使用数组键值作为变量值
*array*
必需。规定要使用的数组。
*extract_rules*
可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。对不合法和冲突的键名的处理将根据此参数决定。
可能的值:
EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 *prefix*。
EXTR_PREFIX_ALL - 给所有变量名加上前缀 *prefix*。
EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 *prefix*。
EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。
EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。
EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
-
*prefix*
可选。请注意 *prefix* 仅在 *extract_type* 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。
前缀和数组键名之间会自动加上一个下划线
1-
    $arr = array('k1'=>'v1','k2'=>'v2','k3'=>'v3');
    extract($arr);
    echo $k1;//输出v1
2-
    $k1 = 'bv';
    $arr = array('k1'=>'v1', 'k2'=>'v2', 'k3'=>'v3');
    extract($arr, EXTR_PREFIX_SAME, 'same');
    echo "$k1 , $k2 , $k3 , $same_k1";
    //输出 bv , v2 , v3 , v1

推荐阅读更多精彩内容