PHP数组基础知识总结以及排序

不打扰是莪最后的温柔 提交于 2019-11-29 17:18:34

最近刚刚实习,经常用到php的数组,所以总结一下,以后不用随时去乱搜。

一:基础知识

PHP支持数字索引数组和关联数组,关联数组允许使用更有意义的数据(如字符串)作为索引。以及允许间隔性地使用数组和字符串作为数组的索引。
1、数组定义:

$arr = [1,2,3,4];//数字索引数组   php5.4以上提供的新方式
$arr = ['a'=>1,'b'=>2];//关联索引数组
$arr = array(1,2,3,4);
$arr = array('a'=>1,'b'=>2);
$arr = range(1,n);//自动创建1~n的数字数组

PHP的数组不需要预先初始化或创建,在第一次使用时就会自动的创建如:

$arr['a'] = 1;
$arr['b'] = 2;
$arr['c'] = 3;

2、数组的遍历

  1. for循环
    只能用于有序的数字索引数组

    for($i = 0;$i<count($arr);$i++){
     echo  $arr[$i];
    }

     

  2. foreach

    for($arr as $key=>$value){
     echo $key."--".$value;
    }

     

  3. each

    while($ele = each($arr)){
     echo ele['key']."--".ele['value'];
    }

     

  4. list(常用)

    reset($arr);//重置指针
    while(list($key,$value) = each($arr)){
    echo   $key."--".$value;
    }

3、二维或多维数组

$arr = array(
    'a' =>array();
    'b' =>array();
    );
 

4、数组定义需要注意(来源于PHP手册)

key 会有如下的强制转换:
1、包含有合法整型值的字符串会被转换为整型。例如键名 “8” 实际会被储存为 8。但是 “08” 则不会强制转换,因为其不是一个合法的十进制数值。
2、 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
3、 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
4、Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
5、数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
6、如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。

$array = array(
    1    => "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
);
var_dump($array);
//结果
array(1) {
  [1]=>
  string(1) "d"
}

二:数组的排序

排序是数组操作中用到最频繁的操作。php提供了很多排序函数。

一:维数组的排序函数

1、sort():可以对一维的数组进行升序排序,如果是数字,则按从小到大排,如果是字符串,则按首字母表排
2、asort():对关联数组进行value的升序
3、ksort():对关联数组进行key的升序
以上三个函数对应的反序函数为rsort(),arsort(),krsort();按降序来排
4、array_reverse():将数组反向
5、shuffle():将数组各元素进行随机排序

二:多维数组的排序

使用sort(),ksort()等函数,可以对一维的数组进行关键字,按值,以及逆向排序等,但是这些函数不能用于多维数组。此时就需要使用用户自定义的排序函数了。
PHP提供了usort(),uasort(),uksort(),函数来对二维数组进行排序,这些函数需要我们自己定义一个排序函数,然后传给它。自定义的函数需要接受两个参数,并返回哪个参数应该排在前面(默认按升序来排):false或负数则第一个参数排前面,true或正数则第二个参数排前面,相等为0。如果要反序,执行将返回值交换

//代码测试
$arr = array(
    array('key1'=>900,'key2'=>'bash1'),
array('key1'=>800,'key2'=>'heh2'),
array('key1'=>950,'key2'=>'gosh4'),
);
var_dump($arr);
function asc_number_sort($x,$y){
    if($x['key1']>$y['key1']){
        return true;
    }else if($x['key1']=$y['key1']){
        return false;
    }else{
        return 0;
    }
}
usort($arr,'asc_number_sort');
var_dump($arr);

//测试结果
array (size=3)
  0 => 
    array (size=2)
      'key1' => int 900
      'key2' => string 'bash1' (length=5)
  1 => 
    array (size=2)
      'key1' => int 800
      'key2' => string 'heh2' (length=4)
  2 => 
    array (size=2)
      'key1' => int 950
      'key2' => string 'gosh4' (length=5)

array (size=3)
  0 => 
    array (size=2)
      'key1' => int 800
      'key2' => string 'heh2' (length=4)
  1 => 
    array (size=2)
      'key1' => int 900
      'key2' => string 'bash1' (length=5)
  2 => 
    array (size=2)
      'key1' => int 950
      'key2' => string 'gosh4' (length=5)
    PHP会将内层的数组不断的发送给这个函数,从而将其排序
      usort()函数根据数值来进行排序,但是它不会保存外层数组的关键字

 

    如果我们将数组改为:
$arr = array(
    'xc' => array('key1' => 900, 'key2' => 'bash1'),
    'as' => array('key1' => 800, 'key2' => 'heh2'),
    'dw' => array('key1' => 950, 'key2' => 'gosh4'),
);测试结果为:array (size=3)
  0 => 
    array (size=2)
      'key1' => int 800
      'key2' => string 'heh2' (length=4)
  1 => 
    array (size=2)
      'key1' => int 900
      'key2' => string 'bash1' (length=5)
  2 => 
    array (size=2)
      'key1' => int 950
      'key2' => string 'gosh4' (length=5)

可以发现最外层数组的关键字’xc’,’as’,’dw’没有保存下来
使用uasort()函数可以保存关键字

uasort($arr, 'asc_number_sort');
array (size=3)
  'as' => 
    array (size=2)
      'key1' => int 800
      'key2' => string 'heh2' (length=4)
  'xc' => 
    array (size=2)
      'key1' => int 900
      'key2' => string 'bash1' (length=5)
  'dw' => 
    array (size=2)
      'key1' => int 950
      'key2' => string 'gosh4' (length=5)
    当使用uksort()函数时;,排序将基于关键字

三:实际使用遇到的一些问题

1、json数组和PHP数组看似很像,实际上并不相同,需要用到
json_decode()函数将json转化为php数组(需要注意编码问题)
2、在数组中如果需要进行if等判断,需要让判断提前跳出,不要将大段逻辑写入了if中。
3、 数组取值:数组从小到大排序,要取最大的n个值应该从后面取
$arr.slice(-n);

PHP数组函数

array() 创建数组。
array_change_key_case() 把数组中所有键更改为小写或大写。
array_chunk() 把一个数组分割为新的数组块。
array_column() 返回输入数组中某个单一列的值。
array_combine() 通过合并两个数组来创建一个新数组。
array_count_values() 用于统计数组中所有值出现的次数。
array_diff() 比较数组,返回差集(只比较键值)。
array_diff_assoc() 比较数组,返回差集(比较键名和键值)。
array_diff_key() 比较数组,返回差集(只比较键名)。
array_diff_uassoc() 比较数组,返回差集(比较键名和键值,使用用户自定义的键名比较函数)。
array_diff_ukey() 比较数组,返回差集(只比较键名,使用用户自定义的键名比较函数)。
array_fill() 用给定的键值填充数组。
array_fill_keys() 用指定键名的给定键值填充数组。
array_filter() 用回调函数过滤数组中的元素。默认去除数组中的空值
array_flip() 交换数组中的键和值。
array_intersect() 比较数组,返回交集(只比较键值)。
array_intersect_assoc() 比较数组,返回交集(比较键名和键值)。
array_intersect_key() 比较数组,返回交集(只比较键名)。
array_intersect_uassoc() 比较数组,返回交集(比较键名和键值,使用用户自定义的键名比较函数)。
array_intersect_ukey() 比较数组,返回交集(只比较键名,使用用户自定义的键名比较函数)。
array_key_exists() 检查指定的键名是否存在于数组中。
array_keys() 返回数组中所有的键名。
array_map() 把数组中的每个值发送到用户自定义函数,返回新的值。
array_merge() 把一个或多个数组合并为一个数组。
array_merge_recursive() 递归地合并一个或多个数组。
array_multisort() 对多个数组或多维数组进行排序。
array_pad() 用值将数组填补到指定长度。
array_pop() 删除数组的最后一个元素(出栈)。
array_product() 计算数组中所有值的乘积。
array_push() 将一个或多个元素插入数组的末尾(入栈)。
array_rand() 返回数组中一个或多个随机的键。
array_reduce() 通过使用用户自定义函数,以字符串返回数组。
array_replace() 使用后面数组的值替换第一个数组的值。
array_replace_recursive() 递归地使用后面数组的值替换第一个数组的值。
array_reverse() 以相反的顺序返回数组。
array_search() 搜索数组中给定的值并返回键名。
array_shift() 删除数组中首个元素,并返回被删除元素的值。
array_slice() 返回数组中被选定的部分。
array_splice() 删除并替换数组中指定的元素。
array_sum() 返回数组中值的和。
array_udiff() 比较数组,返回差集(只比较值,使用一个用户自定义的键名比较函数)。
array_udiff_assoc() 比较数组,返回差集(比较键和值,使用内建函数比较键名,使用用户自定义函数比较键值)。
array_udiff_uassoc() 比较数组,返回差集(比较键和值,使用两个用户自定义的键名比较函数)。
array_uintersect() 比较数组,返回交集(只比较值,使用一个用户自定义的键名比较函数)。
array_uintersect_assoc() 比较数组,返回交集(比较键和值,使用内建函数比较键名,使用用户自定义函数比较键值)。
array_uintersect_uassoc() 比较数组,返回交集(比较键和值,使用两个用户自定义的键名比较函数)。
array_unique() 删除数组中的重复值。
array_unshift() 在数组开头插入一个或多个元素。
array_values() 返回数组中所有的值。
array_walk() 对数组中的每个成员应用用户函数。
array_walk_recursive() 对数组中的每个成员递归地应用用户函数。
arsort() 对关联数组按照键值进行降序排序。
asort() 对关联数组按照键值进行升序排序。
compact() 创建包含变量名和它们的值的数组。
count() 返回数组中元素的数目。
current() 返回数组中的当前元素。
each() 返回数组中当前的键/值对。
end() 将数组的内部指针指向最后一个元素。
extract() 从数组中将变量导入到当前的符号表。
in_array() 检查数组中是否存在指定的值。
key() 从关联数组中取得键名。
krsort() 对数组按照键名逆向排序。
ksort() 对数组按照键名排序。
list() 把数组中的值赋给一些变量。
natcasesort() 用“自然排序”算法对数组进行不区分大小写字母的排序。
natsort() 用“自然排序”算法对数组排序。
next() 将数组中的内部指针向前移动一位。
pos() current() 的别名。
prev() 将数组的内部指针倒回一位。
range() 创建包含指定范围单元的数组。
reset() 将数组的内部指针指向第一个元素。
rsort() 对数组逆向排序。
shuffle() 将数组打乱。
sizeof() count() 的别名。
sort() 对数组排序。
uasort() 使用用户自定义的比较函数对数组中的键值进行排序。
uksort() 使用用户自定义的比较函数对数组中的键名进行排序。
usort() 使用用户自定义的比较函数对数组进行排序。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!