数组能够在单独的变量名中存储一个或多个值

它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。 由于 array 的值可以是其它 array 所以树形结构和多维 array 也是允许的。

key 可以是 integer 或者 string。value 可以是任意类型。
此外 key 会有如下的强制转换:

  • String 中包含有效的十进制 int,除非数字前面有一个 + 号,否则将被转换为 int 类型。例如键名 “8” 实际会被储存为 8。另外, “08” 不会被强制转换,因为它不是一个有效的十进制整数。
  • Float 也会被转换为 int ,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
  • Bool 也会被转换成 int。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
  • Array 和 object 不能 被用为键名。坚持这么做会导致警告:Illegal offset type。

类型转换与覆盖的示例

  1. <?php
  2. $array = array(
  3. 1 => "a",
  4. "1" => "b",
  5. 1.5 => "c",
  6. true => "d",
  7. );
  8. var_dump($array);
  9. ?>

以上例程会输出:
array(1) { [1]=> string(1) “d” }

更多文章: https://www.php.net/manual/zh/language.types.array.php

创建数组array()

函数用于创建数组:
$cars=array(“porsche”,”BMW”,”Volvo”);
可以用短数组语法 [] 替代 array() 。

添加数组

元素的方式,对于数字下标数组:
$names[] = ‘ruby’;

分类

1. 索引数组

带有数字索引的数组

2. PHP 关联数组

关联数组是使用您分配给数组的指定键的数组。

  • 创建关联数组1

$age=array(“Bill”=>”35”,”Steve”=>”37”,”Elon”=>”43”);

  • 创建关联数组2

$age[‘Bill’]=”63”; $age[‘Steve’]=”56”; $age[‘Elon’]=”47”;

  • 遍历关联数组
    foreach($age as $x=>$x_value) {
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "<br>";
    }
    

3. 多维数组

  • 包含一个或多个数组的数组

数组基础函数

  • count()

函数用于返回数组的长度(元素数):
遍历数组
$cars=array(“porsche”,”BMW”,”Volvo”);
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++) {
echo $cars[$x];
echo “
“;
}

  • is_array():判断是否为数组
  • list()

list() 实际上是语言结构,不是函数。
把数组中的值赋给一些变量:

<?php
$my_array = array("Dog","Cat","Horse");

list($a, $b, $c) = $my_array;
echo "I have several animals, a $a, a $b and a $c.";
?>

数组可用函数

in_array() 函数 array_search()

standard 区分大小写

<?php
$people = array("Bill", "Steve", "Mark", "David");

if (in_array("Mark", $people)){
  echo "匹配已找到";
} else {
  echo "匹配未找到";
}

?>

inarray(_search,array,type)

search 必需。规定要在数组搜索的值。
array 必需。规定要搜索的数组。
type 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。

如果给定的值search存在于数组array中则返回 true。如果第三个参数设置为 true,函数只有在元素存在于数组中且数据类型与给定值相同时才返回 true。
如果没有在数组中找到参数,函数返回 false。
注释:如果 search 参数是字符串,且 type 参数设置为 true,则搜索区分大小写。

array_search(value,array,strict)
array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,则返回匹配该元素所对应的键名。如果没找到,则返回 false。注意在 PHP 4.2.0 之前,函数在失败时返回 null 而不是 false。同样如果第三个参数 strict 被指定为 true,则只有在数据类型和值都一致时才返回相应元素的键名。

isset() /array_key_exists()

当数据量比较大的时候,用 array_key_exists 比较合适。据测试 array_key_exist 要比 in_array 效率高十几甚至几十倍。
php中有两个函数用来判断数组中是否包含指定的键,分别是array_key_exists和isset
array_key_exists语法如下
array_key_exists($key, $array)

该函数是判断某个数组array中是否存在指定的 key,如果该 key 存在,则返回 true,否则返回 false。 提示:请记住,如果您指定数组的时候省略了键名,将会生成从 0 开始并且每个键值对应以 1 递增的整数键名。

如果键存在返回true isset函数语法如下
isset($array[$key])

如果键存在返回true
演示代码如下:

<?php
$array= array("Zero"=>"PHP", "One"=>"Perl", "Two"=>"Java");
print("Is 'One' defined? ".array_key_exists("One", $array)."\n");
print("Is '1' defined? ".array_key_exists("1", $array)."\n");

print("Is 'Two' defined? ".isset($array["Two"])."\n");
print("Is '2' defined? ".isset($array[2])."\n");
?>

返回结果如下:
Is ‘One’ defined? 1
Is ‘1′ defined?
Is ‘Two’ defined? 1
Is ‘2′ defined?

unset/array_values删除元素/重新索引使用

https://www.runoob.com/w3cnote/php-delete-an-element-from-an-array.html

<?php
  $arr = array(1=>'one',2=>'two',3=>'three'); 

  //删除下标为2的元素 
  unset($arr[2]); //将得到Array(1=>'one',3=>'three') 

  //使用array_values()重新建立索引 
  $aar = array_values($arr); //$aar = array(0=>'one',1=>'three') 
?>

reset()

reset() 函数将内部指针指向数组中的第一个元素,并输出。
相关的方法:

  • current()- 返回数组中的当前元素的值
  • end()- 将内部指针指向数组中的最后一个元素,并输出
  • next()- 将内部指针指向数组中的下一个元素,并输出
  • prev()- 将内部指针指向数组中的上一个元素,并输出
  • each() - 返回当前元素的键名和键值,并将内部指针向前移动 ```php <?php$people = array(“Bill”, “Steve”, “Mark”, “David”);

echo current($people) . “
“;// Bill

echo next($people) . “
“; // Steve echo reset($people); // Bill ?>

<a name="UEYBY"></a>
## array_pop()
删除数组中的最后一个元素
```php
$a=array("red","green","blue");
// 必需。规定数组。
array_pop($a);

// 返回数组的最后一个值。如果数组是空的,或者非数组,将返回 NULL。
print_r($a);

array_push() 尾部添加

尾部添加元素,返回数组新的单元总数。
语法格式如下:
int array_push ( array &$array , mixed $var [, mixed $… ] )
参数 array 为指定的数组,参数 $var 为压入数组中的值。

$array_push = array("PHP中文网","百度一下");//定义数组
array_push($array_push,"搜狗浏览器","火狐浏览器");//添加元素
print_r($array_push);// 输出数组结果
// PHP中文网 百度一下 搜狗浏览器 火狐浏览器

array_unshift() 头部添加

用于向数组插入新元素。新数组的值将被插入到数组的开头。
被加上的元素作为一个整体添加,这些元素在数组中的顺序和在参数中的顺序一样。
该函数会返回数组中元素的个数。
提示:您可以插入一个或多个值。
注释:数值键名将从 0 开始,以 1 递增。字符串键名将保持不变。

$names = ['andy', 'tom', 'jack'];
array_unshift($names, 'joe', 'hank');
print_r($names);
// joe  hank andy tom jack

array_splice

array_splice(array,offset,length,array)

参数 描述
array 必需。规定数组。
offset 必需。数值。如果 offset 为正,则从输入数组中该值指定的偏移量开始移除。如果 offset 为负,则从输入数组末尾倒数该值指定的偏移量开始移除。
length 可选。数值。如果省略该参数,则移除数组中从 offset 到 结尾的所有部分。如果指定了 length 并且为正值,则移除这么多元素。如果指定了 length 且为负值,则移除从 offset 到数组末尾倒数 length 为止中间所有的元素。
array 被移除的元素由此数组中的元素替代。如果没有移除任何值,则此数组中的元素将插入到指定位置。
案例一、

<?php
  $a1=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird");
  $a2=array(0=>"Tiger",1=>"Lion");
  array_splice($a1,0,2,$a2);
  print_r($a1);
?>

Array ( [0] => Tiger [1] => Lion [2] => Horse [3] => Bird )

案例二、

<?php
  $a1=array(0=>"Dog",1=>"Cat");
  $a2=array(0=>"Tiger",1=>"Lion");
  array_splice($a1,1,0,$a2);
  print_r($a1);
?>

输出:
Array ( [0] => Dog [1] => Tiger [2] => Lion [3] => Cat )

implode() 函数

把数组元素组合为一个字符串:

separator 可选。规定数组元素之间放置的内容。默认是 “”(空字符串)。
array 必需。要组合为字符串的数组。
<?php
$arr = array('Hello','World!','Beautiful','Day!');
echo implode(" ",$arr);
?>
// Hello World! Beautiful Day!

array_column

https://www.w3school.com.cn/php/func_array_column.asp
arraycolumn(_array,column_key,index_key);

参数 描述
array 必需。规定要使用的多维数组(记录集)。
column_key 必需。需要返回值的列。
可以是索引数组的列的整数索引,或者是关联数组的列的字符串键值。
该参数也可以是 NULL,此时将返回整个数组(配合 index_key 参数来重置数组键的时候,非常有用)。
index_key 可选。用作返回数组的索引/键的列。

array_combine

通过合并两个数组来创建一个新数组,其中的一个数组元素为键名,另一个数组元素为键值:

<?php
    $fname =array("Bill","Steve","Mark"); 
    $age   =array("60","56","31");
    $c     =array_combine($fname,$age); 
    print_r($c);
 ?>

Array ( [Bill] => 60 [Steve] => 56 [Mark] => 31 )

array_merge

array_merge() 函数把一个或多个数组合并为一个数组。
提示:您可以向函数输入一个或者多个数组。
注释:如果两个或更多个数组元素有相同的键名,则最后的元素会覆盖其他元素。
注释:如果您仅向 array_merge() 函数输入一个数组,且键名是整数,则该函数将返回带有整数键名的新数组,其键名以 0 开始进行重新索引(参见下面的实例 1)。

<?php
$a1=array("a"=>"red","b"=>"green");
$a2=array("c"=>"blue","b"=>"yellow");
print_r(array_merge($a1,$a2));
?>

Array ( [a] => red [b] => yellow [c] => blue )

array_map

https://www.php.net/manual/zh/function.array-map.php

<?php
function cube($n)
{
    return ($n * $n * $n);
}

$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);
?>

去重

array_unique去重后, 不会重新索引

<?php
function FetchRepeatMemberInArray($array) {
    // 获取去掉重复数据的数组
    $unique_arr = array_unique ( $array );
    // 获取重复数据的数组
    $repeat_arr = array_diff_assoc ( $array, $unique_arr );
    return $repeat_arr;
}

// 测试用例
$array = array (
        'apple',
        'iphone',
        'miui',
        'apple',
        'orange',
        'orange' 
);
$repeat_arr = FetchRepeatMemberInArray ( $array );
print_r ( $repeat_arr );
?>

排序

简单排序

$data = array(5,8,1,7,2);
sort($data);
print_r($data);
rsort($data);// 函数对数组元素进行从高到低的倒排

关键字key排序

$data = array("US" => "United States", "IN" => "India", "DE" => "Germany", "ES" => "Spain");
ksort($data);
print_r($data);

asort() 函数对关联数组按照键值进升序排序。
提示:请使用 arsort() 函数对关联数组按照键值进行降序排序。
提示:请使用 ksort() 函数对关联数组按照键名进行升序排序。
提示:请使用 krsort() 函数对关联数组按照键名进行降序排序。

按数组里某个字段排序

$aList=json_decode("[      {        \"end_date\": \"2021-12-10\",        \"start_date\": \"2022-12-06\",        \"passenger_fee\": 1      }   ]",true);
usort($aList, 'sortByStartDate');

function sortByStartDate($a, $b): int {
    if ($a['start_date'] > $b['start_date']) {
        return 1;
    } else {
        return -1;
    }

}
foreach ($aList as $aData) {
    var_dump($aData['start_date']);
}

更多排序
https://www.cnblogs.com/sandea/p/5634294.html

注意

1. foreach参数不能为空

$empty = array();
$empty['222'] = 2;
foreach($empty['222'] as $_){
    echo "$_<br/>";
}

Warning: Invalid argument supplied for foreach() in /Users/didi/workspace/test/test3.php on line 21