如何“rtrim”PHP数组(仅向数组的END移除空元素)并尽可能避免使用for或类似的循环

Much like rtrim() to a string, how do I remove the empty elements of an array only after the last non-empty element towards the end of the array while avoiding a for or similar loop and possibly using PHP's array functions instead?

I'm actually looking for the fastest/most efficient/elegant way, but if this is not possible without a for or similar loop or I'm mistaken about "fast/efficient/elegant" especially with PHP's array functions then I'd be more than happy to learn/know what's best. Thanks.

Other assumptions:

  1. There can be a series of single or consecutive empty elements before the last non-empty element in the array.
  2. No need to worry about an empty array, but if this case is covered it's totally fine.

For example:

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

would end up being:

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

and

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

would end up being:

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

It's like you wrote it in your question: As long as the last value is an empty string, remove it from the array:

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

Edit: I have no clue how serious this is, however for the fun, I've come up with this which does not uses any loop in user-code, however, loops are involved for sure inside PHP C functions. Probably this can make a difference, no idea, to enjoy responsively:

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

How it works:

  • Get an array with all values that are not in array(""). Keys will be preserved (that's the important part, the keys in your array are 0-n).
  • Get the key of the last element.
  • Slice the array from start to that position.
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
)

Use trim() or rtrim() as you need it:

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

It changes …

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

… to …

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

Once you rebuild your array, use array_values to rebuild the indexes.

array_walk_recursive('unset_any_null_values_function', $array);

print_r(array_values($array));