Как "rtrim" массив PHP (удалять пустые элементы ТОЛЬКО в сторону END массива) и избегать использования для или аналогичного цикла, если возможно

Как строка rtrim() для строки, как удалить пустые элементы массива только после последнего непустого элемента в конце массива, избегая при этом for или аналогичного цикла и, возможно, используя массив PHP функции вместо?

Я действительно ищу самый быстрый/самый эффективный/элегантный способ, но если это невозможно без for или аналогичного цикла, или я ошибаюсь в отношении "быстрого/эффективного/элегантного", особенно с функциями массива PHP то я был бы более чем счастлив узнать/узнать, что лучше всего. Спасибо.

Другие предположения:

  • До последнего непустого элемента в массиве может быть серия одиночных или последовательных пустых элементов.
  • Не нужно беспокоиться о пустом массиве, но если этот случай полностью покрыт, то он полностью прекрасен.

Например:

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"
)

Ответ 1

Это похоже на то, как вы написали его в своем вопросе: до тех пор, пока последнее значение является пустой строкой, удалите его из массива:

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).
  • Получить ключ последнего элемента.
  • Нарисуйте массив от начала до этой позиции.

Ответ 2

Используйте trim() или rtrim() по мере необходимости:

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

Изменяется...

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
)

Ответ 3

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
)

Ответ 4

Как только вы восстановите свой массив, используйте array_values для восстановления индексов.

array_walk_recursive('unset_any_null_values_function', $array);

print_r(array_values($array));