09-PHP使用过的函数 81-90

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): array

array_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 $arraycallable $callbackmixed $initial = null): mixed

array

输入的 array。

callback

callback(mixed $carrymixed $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 &$arraycallable $callbackmixed $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

?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七色的天空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值