注意
array_pop() 的复杂度为 O(1)。
array_shift() 的复杂度为 O(n)。
array_shift() 需要对数组进行重新索引处理,因此它必须遍历所有元素并对其进行索引。
(PHP 4, PHP 5, PHP 7, PHP 8)
array_pop — 从数组末尾弹出元素
array_pop() 弹出并返回 array
的最后一个元素的值,并将 array
缩短一个元素。
array
要从中获取值的数组。
返回 array
的最后一个元素的值。如果 array
为空,则返回 null
。
范例 #1 array_pop() 范例
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_pop($stack);
print_r($stack);
?>
之后,$stack 将只有 3 个元素
Array ( [0] => orange [1] => banana [2] => apple )
而 raspberry
将被赋值给 $fruit。
注意
array_pop() 的复杂度为 O(1)。
array_shift() 的复杂度为 O(n)。
array_shift() 需要对数组进行重新索引处理,因此它必须遍历所有元素并对其进行索引。
请注意,当您尝试从数组中弹出元素时,array_pop 不会发出任何警告或错误,即使该数组已经为空。这很奇怪!而且会导致级联错误,很难在不知道真正原因的情况下解决。
它似乎只是默默地返回了一个 NULL 对象,而不是错误,因此在我的情况下,我最终得到了关于访问具有无效索引的数组元素的警告,因为我预计会弹出数组。这种行为(以及缺乏任何警告,因为许多琐碎的事情被冗长地抱怨)在以上手册中没有提到。弹出已经为空的堆栈绝对应该触发某种通知,以帮助调试。
当然,将弹出操作包装在 if (count($array)) 中可能是好习惯,但如果尝试执行应该失败且显然不会返回有意义结果的操作没有返回错误,那么应该在手册中建议这样做。
我编写了一个简单的函数来对多个(无限制)数组执行交集。
传递一个包含要比较的所有数组的数组,以及要匹配的键。
<?php
function multipleArrayIntersect($arrayOfArrays, $matchKey)
{
$compareArray = array_pop($arrayOfArrays);
foreach($compareArray AS $key => $valueArray){
foreach($arrayOfArrays AS $subArray => $contents){
if (!in_array($compareArray[$key][$matchKey], $contents)){
unset($compareArray[$key]);
}
}
}
return $compareArray;
}
?>
如果您将已拆分的数组放入 array_pop 中,将抛出 Strict Standards
<?php
$a = array_pop(explode(",", "a,b,c"));
echo $a;
?>
您将看到
PHP Strict Standards: 在 - 第 2 行中,只能传递变量作为引用。
PHP Strict Standards: 在 - 第 2 行中,只能传递变量作为引用。
c
请注意,您应该为 explode 函数分配一个变量,然后将该变量引用传递到 array_pop 中,以避免 Strict Standard 警告。
在之前的示例中...
<?php
function array_trim ( $array, $index ) {
if ( is_array ( $array ) ) {
unset ( $array[$index] );
array_unshift ( $array, array_shift ( $array ) );
return $array;
}
else {
return false;
}
}
?>
这有一个问题。如果您取消设置最后一个值,然后使用
<?
array_unshift ( $array, array_shift ( $array ) );
?>
将返回:Array ( [0] => )
因此您可以使用以下方法修复它...
<?php
if (count($array) > 0) array_unshift ( $values, array_shift ( $values ) );
?>
祝您好运;)
为了 array_unshift() 的缘故
:)
<?php
function array_unpop(&$arr) {
$args = func_get_args(); unset($args[0]);
$tarr = array();
foreach ($args as $arg) {
$tarr[] = $arg;
}
$arr = array_merge($arr, $tarr);
}
$queue = array("orange", "banana");
array_unpop($queue, "apple", "raspberry");
print_r($queue);
?>
数组
(
[0] => 橙色
[1] => 香蕉
[2] => 苹果
[3] => 树莓
)
@smp_info
我认为你仍然很累。用
<?php
$array = array('one', 'two', 'three', 'four');
// 弹出最后一个元素
array_pop($array);
//$array == array('one', 'two', 'three');
?>
正如文档中明确指出的,array_pop() 不仅返回最后一个元素,而且实际上还从通过引用传递的数组中删除它。调用 array_diff 是浪费资源。
strrchr 比使用 array_pop 的其他示例更有效地用于查找文件的扩展名。例如
<?php
$ext = strrchr($filename, ".");
?>
如果文件有扩展名,则 $ext 将包含文件的扩展名,包括一个“.”,如果文件没有扩展名,则为 FALSE。如果文件有多个扩展名,例如“filename.tar.gz”,则此构造将只返回最后一个扩展名。
[email protected]
你好
这里有一个函数可以从数组中删除元素并重新计算索引
<?php
function eliminarElementoArreglo ($array, $indice)
{
if (array_key_exists($indice, $array))
{
$temp = $array[0];
$array[0] = $array[$indice];
$array[$indice] = $temp;
array_shift($array);
// 重新排列索引
for ($i = 0 ; $i < $indice ; $i++)
{
$dummy = $array[$i];
$array[$i] = $temp;
$temp = $dummy;
}
}
return $array;
}
?>
当我使用此函数时遇到问题,因为我的数组完全由数字组成,所以我创建了自己的函数。希望它对某些人有用。
function array_trim_end($array){
$num=count($array);
$num=$num-1;
unset($array[$num]);
return $array;
}
你好,
这是一个简单的函数,可以从数组中删除一个元素(带值)
<?php
/*
* 此函数从一维数组中删除给定元素
* 参数:$array:数组(输入/输出)
* $deleteIt:要删除的值
* $useOldKeys:如果为 false,则函数将重新索引数组(从 0、1、... 开始)
* 如果为 true:函数将保留旧的键
* 返回 true,如果此值在数组中,否则返回 false(在这种情况下,数组与之前相同)
*/
function deleteFromArray(&$array, $deleteIt, $useOldKeys = FALSE)
{
$tmpArray = array();
$found = FALSE;
foreach($array as $key => $value)
{
if($value !== $deleteIt)
{
if(FALSE === $useOldKeys)
{
$tmpArray[] = $value;
}
else
{
$tmpArray[$key] = $value;
}
}
else
{
$found = TRUE;
}
}
$array = $tmpArray;
return $found;
}
?>
也许它会帮助某人...