如何“修剪”PHP数组(仅在数组的末尾删除空元素),并尽可能避免for或类似的循环


How to "rtrim" a PHP array (remove empty elements ONLY towards the END of the array) and avoid a for or similar loop if possible

>就像rtrim()字符串一样,如何在数组末尾的最后一个非空元素之后删除数组的空元素,同时避免for或类似的循环,并可能使用 PHP 的数组函数代替?

我实际上正在寻找最快/最高效/优雅的方式,但如果如果没有for或类似的循环就无法做到这一点,或者我误解了"快速/高效/优雅",尤其是 PHP 的数组函数,那么我很乐意学习/知道什么是最好的。谢谢。

其他假设:

  1. 在数组中的最后一个非空元素之前可以有一系列单个或连续的空元素。
  2. 无需担心空数组,但如果这种情况被覆盖,那就完全没问题了。

例如:

Array
(
    [0] => ""
    [1] => "text"
    [2] => "text"
    [3] => ""
    [4] => "text"
    [5] => ""
    [6] => ""
    [7] => "text"
    [8] => ""
    [9] => ""
)

最终会成为:

Array
(
    [0] => ""
    [1] => "text"
    [2] => "text"
    [3] => ""
    [4] => "text"
    [5] => ""
    [6] => ""
    [7] => "text"
)

Array
(
    [0] => "text"
    [1] => "text"
    [2] => "text"
    [3] => "text"
    [4] => "text"
    [5] => "text"
    [6] => "text"
    [7] => ""
    [8] => ""
    [9] => ""
)

最终会成为:

Array
(
    [0] => "text"
    [1] => "text"
    [2] => "text"
    [3] => "text"
    [4] => "text"
    [5] => "text"
    [6] => "text"
)

就像你在问题中写的那样: 只要最后一个值是空字符串,就将其从数组中删除:

while ("" === end($array))
{
    array_pop($array);
}

编辑:我不知道这有多严重,但是为了好玩,我想出了这个在用户代码中不使用任何循环的方法,但是,PHP C函数中肯定涉及循环。也许这可以有所作为,不知道,享受响应式:

$array = array_slice($array, 0, key(array_reverse(array_diff($array, array("")), 1))+1);

工作原理:

  • 获取一个数组,其中包含不在 array("") 中的所有值。密钥将被保留(这是重要的部分,数组中的密钥是 0-n(。
  • 获取最后一个元素的键。
  • 将阵列从起点切到该位置。
根据需要

使用trim()rtrim()

explode( '·', trim( implode( '·', $test ), '·') );

它改变了...

Array
(
    [0] => 
    [1] => text
    [2] => text
    [3] => 
    [4] => text
    [5] => 
    [6] => 
    [7] => text
    [8] => 
)

。自。。。

Array
(
    [0] => text
    [1] => text
    [2] => 
    [3] => text
    [4] => 
    [5] => 
    [6] => text
)
function array_rtrim($array)
{
    $array = array_reverse($array);
    foreach ($array as $key => $value)
    if ((string) $value === '') unset($array[$key]); else break 1;
    return array_reverse($array);
}

$array = array('', 1, 2, 3, '', 0, '', '');
print_r(array_rtrim($array));

Array
(
    [0] => 
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 
    [5] => 0
)
while (!end($array)) { array_pop($array); };

重建数组后,使用 array_values 重建索引。

array_walk_recursive('unset_any_null_values_function', $array);
print_r(array_values($array));