81、array_splice
把
array
数组中由offset
和length
指定的单元去掉,如果提供了replacement
参数,则用其中的单元取代。array_splice(
array&$array
,
int$offset
,
?int$length
=null
,
mixed$replacement
= []
): array
注意:
array
中的数字键名不被保留。注意: 如果
replacement
不是数组,会被 类型转换 成数组 (例如:(array) $replacement
)。 当传入的replacement
是个对象或者null
,会导致未知的行为出现。
array
输入的数组。
offset
如果
offset
为正,则从array
数组中该值指定的偏移量开始移除。如果
offset
为负,则从array
末尾倒数该值指定的偏移量开始移除。
length
如果省略
length
,则移除数组中从offset
到结尾的所有部分。如果指定了
length
并且为正值,则移除这么多单元。如果指定了
length
并且为负值,则移除部分停止于数组末尾该数量的单元。如果设置了
length
为零,不会移除单元。小技巧
当给出了
replacement
时要移除从offset
到数组末尾所有单元时,用count($input)
作为length
。
replacement
如果给出了
replacement
数组,则被移除的单元被此数组中的单元替代。如果
offset
和length
的组合结果是不会移除任何值,则replacement
数组中的单元将被插入到offset
指定的位置。注意:
不保留替换数组
replacement
中的键名。如果用来替换
replacement
只有一个单元,那么不需要给它加上array()
或方括号,除非该单元本身就是一个数组、一个对象或者null
。
示例1:
<?php
$input = array("red", "green", "blue", "yellow");
array_splice($input, 2);
var_dump($input);
$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, -1);
var_dump($input);
$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, count($input), "orange");
var_dump($input);
$input = array("red", "green", "blue", "yellow");
array_splice($input, -1, 1, array("black", "maroon"));
var_dump($input);
?>
以上例程会输出:
array(2) { [0]=> string(3) "red" [1]=> string(5) "green" } array(2) { [0]=> string(3) "red" [1]=> string(6) "yellow" } array(2) { [0]=> string(3) "red" [1]=> string(6) "orange" } array(5) { [0]=> string(3) "red" [1]=> string(5) "green" [2]=> string(4) "blue" [3]=> string(5) "black" [4]=> string(6) "maroon" }
示例2:几个以不同表达式实现相同效果的 array_splice() 例子,以下表达式是相同的:
<?php
// 添加两个新元素到 $input
array_push($input, $x, $y);
array_splice($input, count($input), 0, array($x, $y));
// 移除 $input 中的最后一个元素
array_pop($input);
array_splice($input, -1);
// 移除 $input 中第一个元素
array_shift($input);
array_splice($input, 0, 1);
// 在 $input 的开头插入一个元素
array_unshift($input, $x, $y);
array_splice($input, 0, 0, array($x, $y));
// 在 $input 的索引 $x 处替换值
$input[$x] = $y; // 对于键名和偏移量等值的数组
array_splice($input, $x, 1, $y);
?>
示例3:
//array_splice():增删改
$arr1 = [10,28,9,33,56,21,82,47];
printf('原始数组元素:<pre>%s</pre>',print_r($arr1,true));
echo '<hr>';
//默认功能:删除
//返回值是被删除的元素
$res1=array_splice($arr1,1,2);
printf('<pre>%s</pre>',print_r($res1,true));
echo '<hr>';
//查看原数组
printf('查看原数组<pre>%s</pre>',print_r($arr1,true));
以上例程会输出:
原始数组元素:
Array ( [0] => 10 [1] => 28 [2] => 9 [3] => 33 [4] => 56 [5] => 21 [6] => 82 [7] => 47 )
Array ( [0] => 28 [1] => 9 )
查看原数组Array ( [0] => 10 [1] => 33 [2] => 56 [3] => 21 [4] => 82 [5] => 47 )
示例4:
//替换
$res2 = array_splice($arr1,1,2,[666,999]);
printf('被删除的元素<pre>%s</pre>',print_r($res2,true));
echo '<hr>';
//查看原数组
printf('查看原数组<pre>%s</pre>',print_r($arr1,true));
echo '<hr>';
以上例程会输出:
被删除的元素
Array ( [0] => 33 [1] => 56 )
查看原数组Array ( [0] => 10 [1] => 666 [2] => 999 [3] => 21 [4] => 82 [5] => 47 )
示例5:
//增加
$res3 = array_splice($arr1,1,0,[666,999]);
printf('被删除的元素<pre>%s</pre>',print_r($res3,true));
echo '<hr>';
//查看原数组
printf('查看原数组<pre>%s</pre>',print_r($arr1,true));
echo '<hr>';
以上例程会输出:
被删除的元素
Array ( )
查看原数组Array ( [0] => 10 [1] => 666 [2] => 999 [3] => 666 [4] => 999 [5] => 21 [6] => 82 [7] => 47 )
82、is_scalar
检测变量是否是一个标量
标量变量是指 int、float、string 或 bool 类型的变量。 array、object 、 resource 和 null 类型不是标量。
返回值:如果
value
是标量,则返回true
,否则返回false
。
注意:
is_scalar() 不会将 resource 类型值视为标量, 因为当前 resources 是基于整数(integer)的抽象数据类型。 不能依赖该执行细节,因为它可能会改变
注意:
is_scalar() 不会将 NULL 检测为标量。
<?php
function show_var($var)
{
if (is_scalar($var)) {
echo $var;
} else {
var_dump($var);
}
}
$pi = 3.1416;
$proteins = array("hemoglobin", "cytochrome c oxidase", "ferredoxin");
show_var($pi);
show_var($proteins)
?>
以上例程会输出:
3.1416 array(3) { [0]=> string(10) "hemoglobin" [1]=> string(20) "cytochrome c oxidase" [2]=> string(10) "ferredoxin" }
83、array_map
为数组的每个元素应用回调函数
array_map(?callable
$callback
, array$array
, array...$arrays
): arrayarray_map() 返回一个 array,包含将
array
的相应值作为回调的参数顺序调用callback
后的结果(如果提供了更多数组,还会利用arrays
传入)。callback
函数形参的数量必须匹配 array_map() 实参中数组的数量。多余的实参数组将会被忽略。如果提供的实参数组的数量不足,将抛出 ArgumentCountError。
callback
回调函数 callable,应用到每个数组里的每个元素。
多个数组操作合并时,
callback
可以设置为null
。 如果只提供了array
一个数组, array_map() 会返回输入的数组。
array
数组,遍历运行
callback
函数。
arrays
额外的数组列表,每个都遍历运行
callback
函数。
返回值:
返回数组,包含将
array
的相应值作为回调的参数调用callback
函数后的结果(如果提供了更多数组,还会利用arrays
传入)。当仅仅传入一个数组时,返回的数组会保留传入参数的键(key)。 传入多个数组时,返回的数组键是按顺序的 integer。
示例1:
<?php
function cube($n)
{
return ($n * $n * $n);
}
$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);
?>
这使得 $b 成为:
Array ( [0] => 1 [1] => 8 [2] => 27 [3] => 64 [4] => 125 )
示例2:
<?php
$func = function(int $value): int {
return $value * 2;
};
print_r(array_map($func, range(1, 5)));
// 或者从 PHP 7.4.0 起:
print_r(array_map(fn($value): int => $value * 2, range(1, 5)));
?>
以上例程会输出:
Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 )
示例3:
<?php
function show_Spanish(int $n, string $m): string
{
return "The number {$n} is called {$m} in Spanish";
}
function map_Spanish(int $n, string $m): array
{
return [$n => $m];
}
$a = [1, 2, 3, 4, 5];
$b = ['uno', 'dos', 'tres', 'cuatro', 'cinco'];
$c = array_map('show_Spanish', $a, $b);
print_r($c);
$d = array_map('map_Spanish', $a , $b);
print_r($d);
?>
以上例程会输出:
// 打印 $c Array ( [0] => The number 1 is called uno in Spanish [1] => The number 2 is called dos in Spanish [2] => The number 3 is called tres in Spanish [3] => The number 4 is called cuatro in Spanish [4] => The number 5 is called cinco in Spanish ) // 打印 $d Array ( [0] => Array ( [1] => uno ) [1] => Array ( [2] => dos ) [2] => Array ( [3] => tres ) [3] => Array ( [4] => cuatro ) [4] => Array ( [5] => cinco ) )
示例4:多个数组的合并操作
传入两个及以上的数组时,它们元素数量将会相同。因为回调函数会并行地处理相互对应的元素。 如果几个数组的元素数量不一致:空元素会扩展短那个数组,直到长度和最长的数组一样。
此函数有个有趣的用法:传入
null
作为回调函数的名称,将创建多维数组(一个数组,内部包含数组。
<?php
$a = [1, 2, 3, 4, 5];
$b = ['one', 'two', 'three', 'four', 'five'];
$c = ['uno', 'dos', 'tres', 'cuatro', 'cinco'];
$d = array_map(null, $a, $b, $c);
print_r($d);
?>
以上例程会输出:
Array ( [0] => Array ( [0] => 1 [1] => one [2] => uno ) [1] => Array ( [0] => 2 [1] => two [2] => dos ) [2] => Array ( [0] => 3 [1] => three [2] => tres ) [3] => Array ( [0] => 4 [1] => four [2] => cuatro ) [4] => Array ( [0] => 5 [1] => five [2] => cinco ) )
示例5:仅有 array1
时,callback
设置为 null
<?php
$array = [1, 2, 3];
var_dump(array_map(null, $array));
?>
以上例程会输出:
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
示例6:array_map() 键(key)是 string
<?php
$arr = array("stringkey" => "value");
function cb1($a) {
return [$a];
}
function cb2($a, $b) {
return [$a, $b];
}
var_dump(array_map('cb1', $arr));
var_dump(array_map('cb2', $arr, $arr));
var_dump(array_map(null, $arr));
var_dump(array_map(null, $arr, $arr));
?>
以上例程会输出:
array(1) { ["stringkey"]=> array(1) { [0]=> string(5) "value" } } array(1) { [0]=> array(2) { [0]=> string(5) "value" [1]=> string(5) "value" } } array(1) { ["stringkey"]=> string(5) "value" } array(1) { [0]=> array(2) { [0]=> string(5) "value" [1]=> string(5) "value" } }
示例7:array_map() - 关联数组
虽然 array_map() 不能直接支持使用数组的键(key)作为输入,但可以使用 array_keys() 进行模拟。
<?php
$arr = [
'v1' => 'First release',
'v2' => 'Second release',
'v3' => 'Third release',
];
// 注意: 在 7.4.0 之前,使用较长的语法来代替匿名函数。
$callback = fn(string $k, string $v): string => "$k was the $v";
$result = array_map($callback, array_keys($arr), array_values($arr));
var_dump($result);
?>
以上例程会输出:
array(3) { [0]=> string(24) "v1 was the First release" [1]=> string(25) "v2 was the Second release" [2]=> string(24) "v3 was the Third release" }
84、 array_keys
array_keys() 返回
input
数组中的数字或者字符串的键名。如果指定了可选参数
filter_value
,则只返回该值的键名。否则input
数组中的所有键名都会被返回。
<?php
$array = array(0 => 100, "color" => "red");
print_r(array_keys($array));
$array = array("blue", "red", "green", "blue", "blue");
print_r(array_keys($array, "blue"));
$array = array("color" => array("blue", "red", "green"),
"size" => array("small", "medium", "large"));
print_r(array_keys($array));
?>
以上例程会输出:
Array ( [0] => 0 [1] => color ) Array ( [0] => 0 [1] => 3 [2] => 4 ) Array ( [0] => color [1] => size )
85、array_values
返回
input
数组中所有的值并给其建立数字索引。
<?php
$array = array("size" => "XL", "color" => "gold");
print_r(array_values($array));
?>
以上例程会输出:
Array ( [0] => XL [1] => gold )
86、get_object_vars
获取指定对象的属性
根据作用域获取指定
object
的可访问非静态属性。返回指定
object
在当前作用域的属性组成的关联数组,属性为已定义、非静态、可访问。
<?php
class foo {
private $a;
public $b = 1;
public $c;
private $d;
static $e;
public function test() {
var_dump(get_object_vars($this));
}
}
$test = new foo;
var_dump(get_object_vars($test));
$test->test();
?>
以上例程会输出:
array(2) { ["b"]=> int(1) ["c"]=> NULL } array(4) { ["a"]=> NULL ["b"]=> int(1) ["c"]=> NULL ["d"]=> NULL }
87、array_reduce
将回调函数
callback
迭代地作用到array
数组中的每一个单元中,从而将数组简化为单一的值。array_reduce(array
$array
, callable$callback
, mixed$initial
=null
): mixed
array
输入的 array。
callback
callback(mixed
$carry
, mixed$item
): mixed
carry
携带上次迭代的返回值; 如果本次迭代是第一次,那么这个值是
initial
。
item
携带了本次迭代的值。
initial
如果指定了可选参数
initial
,该参数将用作处理开始时的初始值,如果数组为空,则会作为最终结果返回。
<?php
function sum($carry, $item)
{
$carry += $item;
return $carry;
}
function product($carry, $item)
{
$carry *= $item;
return $carry;
}
$a = array(1, 2, 3, 4, 5);
$x = array();
var_dump(array_reduce($a, "sum")); // int(15)
var_dump(array_reduce($a, "product", 10)); // int(1200), 因为:10*1*2*3*4*5
var_dump(array_reduce($x, "sum", "No data to reduce")); // string(17) "No data to reduce"
?>
88、array_walk
使用用户自定义函数对数组中的每个元素做回调处理
array_walk(array|object
&$array
, callable$callback
, mixed$arg
=null
): bool
将用户自定义函数
callback
应用到array
数组中的每个单元。array_walk() 不会受到
array
内部数组指针的影响。array_walk() 会遍历整个数组而不管指针的位置。
array
输入的数组。
callback
典型情况下
callback
接受两个参数。array
参数的值作为第一个,键名作为第二个。注意:
如果
callback
需要直接作用于数组中的值,则给callback
的第一个参数指定为引用。这样任何对这些单元的改变也将会改变原始数组本身。注意:
参数数量超过预期,传入内置函数 (例如 strtolower()), 将抛出警告,所以不适合当做
callback
。只有
array
的值才可以被改变,用户不应在回调函数中改变该数组本身的结构。例如增加/删除单元,unset 单元等等。如果 array_walk() 作用的数组改变了,则此函数的的行为未经定义,且不可预期。
arg
如果提供了可选参数
arg
,将被作为第三个参数传递给callback
。
返回值:返回
true
。
<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
function test_alter(&$item1, $key, $prefix)
{
$item1 = "$prefix: $item1";
}
function test_print($item2, $key)
{
echo "$key. $item2\n";
}
echo "Before ...:\n";
array_walk($fruits, 'test_print');
array_walk($fruits, 'test_alter', 'fruit');
echo "... and after:\n";
array_walk($fruits, 'test_print');
?>
以上例程会输出:
Before ...: d. lemon a. orange b. banana c. apple ... and after: d. fruit: lemon a. fruit: orange b. fruit: banana c. fruit: apple
89、file_exists
检查文件或目录是否存在
<?php
$filename = '/path/to/foo.txt';
if (file_exists($filename)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
?>
90、include
include
表达式包含并运行指定文件。以下文档也适用于 require。
被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找。如果在 include_path 下没找到该文件则
include
最后才在调用脚本文件所在的目录和当前工作目录下寻找。如果最后仍未找到文件则include
结构会发出一条E_WARNING
;这一点和 require 不同,后者会发出一个E_ERROR
。注意如果文件无法访问,
include
和require
在分别发出最后的E_WARNING
或E_ERROR
之前,都会发出额外一条E_WARNING
。
示例1:
vars.php
<?php
$color = 'green';
$fruit = 'apple';
?>
test.php
<?php
echo "A $color $fruit"; // A
include 'vars.php';
echo "A $color $fruit"; // A green apple
//include,require,功能一样,区别在于出错的处理上
//include:忽略错误,继续执行后面的代码,require,直接退出
?>
如果 include 出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。此规则的一个例外是魔术常量,它们是在发生包含之前就已被解析器处理的。
示例2:函数中的包含
<?php
function foo()
{
global $color;
include 'vars.php';
echo "A $color $fruit";
}
/* vars.php 在 foo() 范围内,所以 $fruit 在范围为不可用。 *
* $color 能用是因为声明成全局变量。 */
foo(); // A green apple
echo "A $color $fruit"; // A green
?>