注意
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 中,将会抛出严格标准警告。
<?php
$a = array_pop(explode(",", "a,b,c"));
echo $a;
?>
你会看到
PHP 严格标准:只有变量才能通过引用传递 - 在第 2 行
PHP 严格标准:只有变量才能通过引用传递 - 在第 2 行
c
请注意,您应该为 explode 函数赋值一个变量,然后将该变量的引用传递给 array_pop 以避免严格标准警告。
在之前的示例中……
<?php
function array_trim ( $array, $index ) {
if ( is_array ( $array ) ) {
unset ( $array[$index] );
array_unshift ( $array, array_shift ( $array ) );
return $array;
}
else {
return false;
}
}
?>
这有个问题。如果你 unset 了最后一个值,然后使用
<?
array_unshift ( $array, array_shift ( $array ) );
?>
将返回:
所以你可以使用…修复它
<?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] => orange
[1] => banana
[2] => apple
[3] => raspberry
)
@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;
}
?>
也许它会帮助某些人……