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

最近刚刚实习,经常用到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() 使用用户自定义的比较函数对数组进行排序。

时间: 2024-10-05 13:19:32

PHP数组基础知识总结以及排序的相关文章

Json数组基础知识

1.对象是一个无序的"'名称/值'对"集合. (1)一个对象以"{"(左括号)开始,"}"(右括号)结束. (2)每个"名称"后跟一个":"(冒号): (3)"'名称/值' 对"之间使用","(逗号)分隔.(如图所示,图中表示数据的方式是类似非确定性自动机的形式,没学过编译原理的人,可能理解起来困难点,实际上也是正则表达式的形式.下同) 例子:表示人的一个对象: 1

java数组基础知识

数组的定义:int[] array=new array[n];int array[]={, , , ,};定义了数组,JVM就会给其一个空间,数组是应用类型的数据类型,其存储方式是随机存储. 数组的遍历,一般是通过循环来遍历其元素的,二维数组可以是通过霜或双重循环来遍历.数组的下标是从0开始的. 数组的替换,数组提供了一个方法,两种重载的形式,此方法为fill(),可以通过此方法来填充数组或者替换数组指定位置的元素. public class Array_Fill { public static

JavaScript数组基础知识

前言: 其实作为一个Java程序员,对JS程序一直都有点"不屑一顾"的感觉,很多人肯定和我一样,有其他语言基础,JS语法根本就懒得看,直接写程序,一般工作也都够用了.但是最近在做一个偏Web Excel项目,需要大量的JS编程和优化,抽空又"恶补"了下JS基础.发现原来对JS的理解偏差还是很大的.不过JS这个东西深入起来其实比Java要容易的. 基础: JS数组和Java数组很类似,值都是有序的,索引从0开始.但是JS数组最大可能的索引为2的32次最大能容纳4294

数组基础知识

/* ============================================================================ Name : TestArray.c Author : lf Version : Copyright : Your copyright notice Description : 数组的基本使用 =========================================================================

JAVA总裁--Java数组基础知识

1.数组的定义: 数组是由一组类型相同的数据元素构成的有序集合,每个数据元素称为一个数组元素(简称为元素),每个元素受n(n≥1)个线性关系的约束,每个元素在n个线性关系中的序号i1.i2.-.in称为该元素的下标,并称该数组为 n 维数组. 2.数组的特点: 元素本身可以具有某种结构,属于同一数据类型: 数组是一个具有固定格式和数量的数据集合. 3.数组的语法: package com.eduask.test; import java.util.Scanner; public class Ar

js数组基础知识链接

http://www.cnblogs.com/qiantuwuliang/archive/2011/01/08/1930499.html 小案例:   <script language="javascript" type="text/javascript"> var sum=0; var arr=[];//动态数组的创建 或 var arr=new Array(); for(var j=0;j<3;j++) { //prompt函数 输入文本框 !

C# 数组基础知识

数组的属性: 数组可以是一维.多维或交错的. 数值数组元素的默认值设置为零,而引用元素的默认值设置为 null. 交错数组是数组的数组,因此,它的元素是引用类型,初始化为 null. 数组的索引从零开始:具有 n 个元素的数组的索引是从 0 到 n-1. 数组元素可以是任何类型,包括数组类型. 数组类型是从抽象基类型 Array 派生的引用类型.由于此类型实现了 IEnumerable 和 IEnumerable,因此可以对 C# 中的所有数组使用 foreach 迭代. 我对数组的理解:在 C

PHP基础入门(四)---PHP数组实用基础知识

PHP数组 数组是特殊的变量,它可以同时保存一个以上的值. ***关键词:数组基础.数组遍历.超全局数组.数组功能.数组函数. 下面来和大家分享一下有关PHP的数组基础知识,希望对你PHP的学习有所帮助~ 一.PHP数组基础部分 一PHP数组的分类 按照下标的不同,PHP数组分为关联数组和索引数组:索引数组:下标从0开始,依次增长关联数组:下标为字符串格式,每个下标字符串与数组的值一一关联对应(类似对象的键值对) 代码演示: 1 $arr1 = array(1,2,3,4,5,6,7);//索引

Java基础知识强化12:Java中运用数组的四种排序方法

1.使用JavaApi文档中的Arrays类中的sort()进行快速排序 首先我们直接看代码如下: 1 package himi.text; 2 3 import java.util.Arrays; 4 5 public class TestDemo01 { 6 7 public static void main(String[] args) { 8 int[] array = {2,12,3,44,27}; 9 /** 10 * 利用使用JavaApi文档中的Arrays类中的sort()进行