2012-04-19 2 views
1

я следующий массив:PHP удалить пустые элементы из сторон массива

Array 
(
[0] => 
[1] => 
[2] => apple 
[3] => 
[4] => orange 
[5] => strawberry 
[6] => 
) 

Как я могу удалить пустые элементы из начала и конца, но не изнутри? Окончательный массив должен выглядеть следующим образом:

Array 
(
[0] => apple 
[1] => 
[2] => orange 
[3] => strawberry 
) 

ответ

1

Там я пойти:

$Array = array('', Allo, ''); 

if(isset($Array[0]) && empty($Array[0])){ 
    array_pop($Array); 
} 

$C = count($Array)-1; 
if(isset($Array[$C]) && empty($Array[$C])){ 
    array_shift($Array); 
} 

Это удалит первый и последний пустой только строки.

Если вы хотите удалить все первый и последний, но только пустые вам нужно сделать, это:

$Array = array('', Allo, '', '', 'Toc', '', '', ''); 

$i=0; 
foreach($Array as $Key => $Value){ 
    if(empty($Value)){ 
     unset($Array[$Key]); 
    } else { 
     break; 
    } 
    $i++; 
} 

$Array = array_reverse($Array); 
$i=0; 
foreach($Array as $Key => $Value){ 
    if(empty($Value)){ 
     unset($Array[$Key]); 
    } else { 
     break; 
    } 
    $i++; 
} 

$Array = array_reverse($Array); 
+0

Не должно ли это быть в какой-то петле? –

+0

@ Rocket Почему? Если вы хотите удалить только первый и последний, если они пусты, нет, потому что вы уже знаете, что ведьма первая и последняя, ​​поэтому вам нужно только проверить, пусты ли они. Если вы хотите удалить ВСЕ первый и последний, кто пуст, то да, вам нужен цикл, см. Мой второй скрипт. –

+0

В исходной почте четко отображаются два элемента, удаляемых с начала массива, а не только один. Ваше редактирование разрешает это, но просто создает резервную копию @Rocket на этом ... – Dutchie432

-1

попробовать это

foreach ($original_array as $index => $val) { 
    if (is_empty($val)) { 
    unset($original_array [$index]); 
    } else { 
    break; 
    } 

} 
+0

За исключением того, что он хочет, чтобы пробел между «яблоком» и «оранжевым» оставался там. –

+0

@Rocket Хороший улов, но я уже его редактировал. – Churk

0

Вы можете использовать

array_pop($array); // remove the last element 
array_shift($array); // remove the first element 

Вы можете выполнить некоторую простую проверку, прежде чем убедиться, что первый и/или последний индекс пуст

10

Вот удобный способ:

while (reset($array) == '') array_shift($array); 
while (end($array) == '') array_pop($array); 

See it in action.

Обязательный комментарий: Я использую свободное сравнение с пустой строкой, потому что это похоже на то, что вы намереваетесь дать вашему примеру. Если вы хотите быть более разборчивы относительно того, какие элементы удалить, пожалуйста, настройте соответствующее условие.

Обновление: бонусная признак PHP уродливый код, который может быть быстрее

Мне пришло в голову, что если есть много в начале и в конце массива пустых элементов выше метод может быть не самым быстрым, потому что он удаляет их по одному, переиндексируя массив на каждом шаге и т. д. Итак, вот решение, которое работает для любого массива и выполняет обрезку всего за один шаг. Предупреждение: уродливый.

$firstNonEmpty = 0; 
$i = 0; 
foreach ($array as $val) { 
    if ($val != '') { 
     $firstNonEmpty = $i; 
     break; 
    } 
    ++$i; 
} 

$lastNonEmpty = $count = count($array); 
end($array); 
for ($i = $count; $i > 0; --$i) { 
    if (current($array) != '') { 
     $lastNonEmpty = $i; 
     break; 
    } 
    prev($array); 
} 

$array = array_slice($array, $firstNonEmpty, $lastNonEmpty - $firstNonEmpty); 

See it in action.

+0

Чистый и сексуальный. Работайте только для первого и последнего пустого. Но если вы посмотрите ближе, [0] и [1] пусты и исчезнут из «должно выглядеть так» ... может быть, ошибка? –

+0

@ DavidBllanger: Да, что случилось? –

+0

Ничего себе, мне это нравится больше, чем мое предложение! +1 sir – Dale

-1
while(strlen($array[0])==0) 
    unset(array[0]); 

$doLoop=(strlen($array[ count(array)-1 ])==0); 
while ($doLoop){ 
    unset($array[ count(array)-1 ]); 
    $doLoop=(strlen($array[ count(array)-1 ])==0); 
} 
+1

Не работает, если массив не индексируется численно. – Jon

+0

.... Что, если вы читаете исходное сообщение, массив есть. – Dutchie432

+0

Справа. Почему предпочитаете решение, которое работает в автомобилях и самолетах, когда вы можете иметь решение, которое действительно работает только в автомобилях. – Jon

0

Вот еще один метод:

<?php 

$array = array('', '', 'banana', '', 'orange', '', '', ''); 

while ($array[0] == '') 
{ 
    array_shift($array); 
} 

$count = count($array); 

while ($array[$count - 1] == '') 
{ 
    array_pop($array); 
    $count--; 
} 

print_r($array); 

?> 
+1

Как и другие решения, это не будет работать, если массив не индексируется численно. – Jon

+0

Хотя ваше утверждение абсолютно верно, его массив численно индексируется. – Dale

+0

@ Дайл: Я думаю, что это был просто FYI :-P –

0

Следующий фрагмент кода будет делать работу:

function removeStartingEmptyIndexes($array) 
{ 
    foreach($array as $i => $item) 
    { 
    if(!empty($item)) { 
     break; 
    } 
    else 
    { 
     unset($array[$i]); 
    } 
    } 

    return $array; 
} 

function trimEmptyIndexes($array) 
{ 
    return array_reverse(removeStartingEmptyIndexes(array_reverse(removeStartingEmptyIndexes($array)))); 
} 

$array = array("", "", "apple", "orange", "", "", "", "lemon", "", ""); 

$array = trimEmptyIndexes($array); 

Просто позвонить "trimEmptyIndexes ($ массив)"

Смежные вопросы