本文记录一些PHP数组处理的方法。
目录
- 1. 检查数组中是否存在某个值
- 2. 检查数组或者变量方法
- 3. 过滤数组元素
- 4. 删除数组元素
- 5. 插入数组元素
- 6. 返回数组最后一个元素
- 7. 数组切片
- 8. 判断两个数组是否相等
- 9. 替换数组元素
- 10. 移除数组重复元素
- 11. 数组排序
1. 检查数组中是否存在某个值
in_array(mixed $needle
, array $haystack
, bool $strict
= false
): bool
- 检查数组中是否存在某个值
- 如果
strict
的值为true
,还会检查needle
的类型是否和haystack
中的相同。
举例:
<?php
/* in_array */
$array1 = ['one', 'two', 'three', 'four', 'five'];
if (in_array("one", $array1)) {
echo "Got one";
}
?>
结果:
Got one
2. 检查数组或者变量方法
变量检查:
- isset() – 检测变量是否已声明并且其值不为 null,释放变量使用 unset() 方法。
- defined() – 检查某个名称的常量是否存在
- empty() – 检查一个变量是否为空,PHP中的“空”元素包括:空字符串
""
、数字0
、浮点数0.0
、字符串"0"
、null
、false
、空数组array()
、声明了但没有值的变量$var
。 - is_null() – 检测变量是否为 null。
- property_exists() – 检查对象或类是否具有该属性。
- method_exists() – 检查类的方法是否存在。
数组检查:
- array_keys(
$array
) – 返回数组中所有键名。 - array_keys(
$array
,$search_value
): 返回search_value
值的键名。 - array_key_exists(
$key
,$array
) – 检查数组里是否有指定的键名或索引。 - array_search(
$needle
,$haystack
) – 在数组$haystack
中搜索给定的值$needle
,返回相应的键名。
3. 过滤数组元素
array_filter(array $array
, ?callable $callback
= null
, int $mode
= 0): array
array
数组中的每个值会传递给callback
回调函数,如果callback
回调函数返回true
,则将array
数组中的当前值返回到结果 array 数组中。- 如果不设置
callback
回调函数,会删除数组array
中的所有“空”元素。 - 过滤后的array 数组键名不会重新索引,可以使用 array_values() 函数对数组进行重新索引。
$mode = 0
– 默认值,接受值作为唯一参数$mode = ARRAY_FILTER_USE_KEY
– 接受键名作为唯一参数$mode = ARRAY_FILTER_USE_BOTH
– 同时接受键名和键值
举例:
<?php
/* array_filter */
$array1 = [0 => '', 1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five'];
$array1 = array_filter($array1);
echo "<pre>";
print_r($array1);
echo "</pre>";
/* array_values */
$array1 = array_values($array1); // 重新索引
echo "<pre>";
print_r($array1);
echo "</pre>";
function odd($var)
{
return $var & 1;
}
function even($var)
{
return !($var & 1);
}
$array1 = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'five' => 5];
$array_even = array_filter($array1, "even");
$array_odd = array_filter($array1, "odd");
echo "<pre>";
print_r($array_even);
echo "</pre>";
echo "<pre>";
print_r($array_odd);
echo "</pre>";
$array2 = [1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five'];
$array_even = array_filter($array2,function($var){ return(!($var & 1));},ARRAY_FILTER_USE_KEY);
$array_odd = array_filter($array2,function($var){ return($var & 1);},ARRAY_FILTER_USE_KEY);
echo "<pre>";
print_r($array_even);
echo "</pre>";
echo "<pre>";
print_r($array_odd);
echo "</pre>";
?>
结果:
Array
(
[1] => one
[2] => two
[3] => three
[4] => four
[5] => five
)
Array
(
[0] => one
[1] => two
[2] => three
[3] => four
[4] => five
)
Array
(
[two] => 2
[four] => 4
)
Array
(
[one] => 1
[three] => 3
[five] => 5
)
Array
(
[2] => two
[4] => four
)
Array
(
[1] => one
[3] => three
[5] => five
)
4. 删除数组元素
① array_pop(array &$array
) – 删除数组最后一个元素
举例:
<?php
/* array_pop */
$array1 = ['one', 'two', 'three', 'four', 'five'];
$last = array_pop($array1);
echo "<pre>";
print_r($array1);
echo "</pre>";
?>
结果:
Array
(
[0] => one
[1] => two
[2] => three
[3] => four
)
② array_shift(array &$array
) – 将数组开头的单元移出数组并作为结果返回
举例:
<?php
/* array_shift */
$array1 = ['one', 'two', 'three', 'four', 'five'];
$first = array_shift($array1);
echo "<pre>";
print_r($array1);
echo "</pre>";
?>
结果:
Array
(
[0] => two
[1] => three
[2] => four
[3] => five
)
5. 插入数组元素
① array_unshift(&$array
, ...$values
) – 在数组开头插入一个或多个元素
举例:
<?php
/* array_unshift */
$array1 = ['one', 'two', 'three', 'four', 'five'];
array_unshift($array1, '0', 'zero');
echo "<pre>";
print_r($array1);
echo "</pre>";
?>
结果:
Array
(
[0] => 0
[1] => zero
[2] => one
[3] => two
[4] => three
[5] => four
[6] => five
)
② array_push(&$array
, ...$values
) – 将一个或多个单元压入数组的末尾(入栈)
建议直接使用 $array[] =
追加元素。
举例:
<?php
/* array_push */
$array1 = ['one', 'two', 'three', 'four', 'five'];
array_push($array1, 'six', 'seven');
$array1[] = 'eight';
echo "<pre>";
print_r($array1);
echo "</pre>";
?>
结果:
Array
(
[0] => one
[1] => two
[2] => three
[3] => four
[4] => five
[5] => six
[6] => seven
[7] => eight
)
③ array_merge(...$arrays
) — 合并一个或多个数组
举例:
<?php
/* array_merge */
$array1 = ['one', 'two', 'three'];
$array2 = ['four', 'five'];
$array3 = array_merge($array1, $array2);
$array1[] = 'eight';
echo "<pre>";
print_r($array3);
echo "</pre>";
?>
结果:
Array
(
[0] => one
[1] => two
[2] => three
[3] => four
[4] => five
)
6. 返回数组最后一个元素
end(&$array
) – 将 array
的内部指针移动到最后一个单元并返回其值。
array_key_last($array
) – 获取一个数组的最后一个键值
举例:
<?php
/* end */
$array1 = ['one', 'two', 'three'];
$last = end($array1);
echo "<pre>";
print_r($last);
echo "</pre>";
echo current($array1) . "<br />/n"; // 返回数组中的当前值
reset($array1); // 将数组的内部指针指向第一个单元
echo current($array1) . "<br />/n";
next($array1); // 将数组的内部指针向后移动一位
echo current($array1) . "<br />/n";
prev($array1); // 将数组的内部指针向前移动一位
echo current($array1) . "<br />/n";
/* array_key_last */
$array1 = ['one', 'two', 'three'];
$last = array_key_last($array1);
echo "<pre>";
print_r($last);
echo "</pre>";
?>
结果:
three
three
one
two
one
2
7. 数组切片
array_slice( $array
, $offset
, $length
= null
, $preserve_keys
= false
) – 返回根据 offset
和 length
参数所指定的 array
数组中的一段序列。
举例:
<?php
/* array_slice */
$array1 = ['one', 'two', 'three', 'four', 'five'];
$output = array_slice($array1, 2);
print_r($output) ;
echo "<br />/n";
$output = array_slice($array1, -3, 2); // 返回 "d"
print_r($output) ;
echo "<br />/n";
$output = array_slice($array1, 0, 3);
print_r($output) ;
echo "<br />/n";
$output = array_slice($array1, 1, -3);
print_r($output) ;
echo "<br />/n";
$output = array_slice($array1, 1, 3);
print_r($output) ;
echo "<br />/n";
$output = array_slice($array1, 1, 3, true);
print_r($output) ;
echo "<br />/n";
?>
结果:
Array ( [0] => three [1] => four [2] => five )
Array ( [0] => three [1] => four )
Array ( [0] => one [1] => two [2] => three )
Array ( [0] => two )
Array ( [0] => two [1] => three [2] => four )
Array ( [1] => two [2] => three [3] => four )
8. 判断两个数组是否相等
array_diff( $array
, ...$arrays
) – 返回在 array
中但是不在其他 array 里的值。可用于判断两个数组是否相等。
array_diff_key( $array
, ...$arrays
) – 返回在 array
中但是未出现在任何其它数组中的键名的值。
举例:
<?php
/* array_diff */
$array1 = ['one', 'two', 'three'];
$array2 = ['one', 'two', 'three', 'four', 'five'];
$output1 = array_diff($array1, $array2);
$output2 = array_diff($array2, $array1);
if (empty($output1) and empty($output2)) {
echo "The arrays are equal";
} else {
echo "The arrays are not equal";
}
?>
结果:
The arrays are not equal
9. 替换数组元素
array_replace( $array
, ...$replacements
) – 使用传递的数组替换第一个数组的元素
举例:
<?php
/* array_replace */
$array1 = ['one', 'two', 'three'];
$array2 = ['four', 'five', 'six'];
$output = array_replace($array1, $array2);
echo "<pre>";
print_r($output);
echo "</pre>";
$array1 = ['one', 'two', 'three', '', '', ''];
$array2 = ['', '', '', 'four', 'five', 'six'];
$output = array_replace($array1,array_slice($array2,3,null,$preserve_keys = true));
echo "<pre>";
print_r($output);
echo "</pre>";
?>
结果:
Array
(
[0] => four
[1] => five
[2] => six
)
Array
(
[0] => one
[1] => two
[2] => three
[3] => four
[4] => five
[5] => six
)
10. 移除数组重复元素
array_unique – 移除数组中重复的值
举例:
<?php
/* array_unique */
$array1 = ['one', 'two', 'three', 'four', 'five', 'five'];
$output = array_unique($array1);
echo "<pre>";
print_r($output);
echo "</pre>";
?>
结果:
Array
(
[0] => one
[1] => two
[2] => three
[3] => four
[4] => five
)
11. 数组排序
常用排序函数如下表:
函数名称 | 排序依据 | 数组索引键保持 | 排序的顺序 |
---|---|---|---|
array_multisort() | 值 | string 键保持不变,int 键重新索引 | 第一个数组或者由选项指定 |
asort() | 值 | 是 | 升序 |
arsort() | 值 | 是 | 降序 |
krsort() | 键 | 是 | 降序 |
ksort() | 键 | 是 | 升序 |
natcasesort() | 值 | 是 | 自然排序,大小写不敏感 |
natsort() | 值 | 是 | 自然排序 |
rsort() | 值 | 否 | 降序 |
shuffle() | 值 | 否 | 随机 |
sort() | 值 | 否 | 升序 |
uasort() | 值 | 是 | 由用户定义 |
uksort() | 键 | 是 | 由用户定义 |
usort() | 值 | 否 | 由用户定义 |
举例:
<?php
/* asort */
$array1 = ['two' => 2, 'one' => 1, 'four' => 4, 'three' => 3, 'five' => 5];
asort($array1);
echo "<pre>";
print_r($array1);
echo "</pre>";
/* ksort */
$array1 = [1 => 'one', 3 => 'three', 2 => 'two', 5 => 'five', 4 => 'four'];
ksort($array1);
echo "<pre>";
print_r($array1);
echo "</pre>";
?>
结果:
Array
(
[one] => 1
[two] => 2
[three] => 3
[four] => 4
[five] => 5
)
Array
(
[1] => one
[2] => two
[3] => three
[4] => four
[5] => five
)
参考资料:
凡事都应当尽可能地简单,而不是较为简单。 ——爱因斯坦
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/272026.html