PHP – Как перенести пустые значения массива на его последние позиции

Как я могу переместить пустые значения массива в его последнюю позицию?

Например:

$givenArray = array( 0=>'green', 1=>'', 2=>'red', 3=>'', 4=>'blue' ); $requiredArray = array( 0=>'green', 1=>'red', 2=>'blue', 3=>'', 4=>'' ); 

При условии, что непустые значения не должны сортироваться. Он должен быть таким, как есть, т.е. только пустые значения должны перемещаться в конец массива.

Мне нужно именно то, что показывают мои примеры.

В этой теме есть намного лучшие / более элегантные ответы, но это тоже работает:

 //strip empties and move to end foreach ($givenArray as $key => $value) { if ($value === "") { unset($givenArray[$key]); $givenArray[] = $value; } } // rebuild array index $givenArray = array_values($givenArray); с //strip empties and move to end foreach ($givenArray as $key => $value) { if ($value === "") { unset($givenArray[$key]); $givenArray[] = $value; } } // rebuild array index $givenArray = array_values($givenArray); 

Демо-версия Codepad

Вы ищете все значения, не являющиеся пустой строкой ( "" ), а затем все значения являются пустой строкой:

 $requiredArray = array_diff($givenArray, array('')) + array_intersect($givenArray, array('')); 

Это даст вам:

 array(5) { [0]=> string(5) "green" [2]=> string(3) "red" [4]=> string(4) "blue" [1]=> string(0) "" [3]=> string(0) "" } 

Это имеет то преимущество, что сохраняет ключ => значение ассоциации. Если вам нужно перенумеровать ключи, просто примените функцию array_values :

 $requiredArray = array_values($requiredArray); 

Это превратит его в ваш необходимый макет ( Demo ):

 array(5) { [0]=> string(5) "green" [1]=> string(3) "red" [2]=> string(4) "blue" [3]=> string(0) "" [4]=> string(0) "" } 

Попробуйте использовать usort .

 function empty_sort ($a, $b) { if ($a == '' && $b != '') return 1; if ($b == '' && $a != '') return -1; return 0; } usort($array, 'empty_sort'); 

Что дает ( Demo ):

 Array ( [0] => blue [1] => green [2] => red [3] => [4] => ) 
 $givenArray = array( 0=>'green', 1=>'', 2=>'red', 3=>'', 4=>'blue' ); foreach($givenArray as $value){ if(empty($value)){ $newarray[] = $value; }else{ $filledarray[] = $value; } } $requiredArray = array_merge($filledarray,$newarray); 

Это должно работать:

 function sortempty( $a, $b ) { return empty( $a ); } usort( $array, 'sortempty' ); 

Выход ( демо ):

 Array ( [0] => blue [1] => green [2] => red [3] => [4] => ) 

usort() позволяет сортировать массив с помощью пользовательской функции. Я возвращаюсь, если $a пуст или нет. Если он пуст, верните 1, что делает значение $a shift вправо (или вниз) в массиве.

Существует функция usort ($ array, $ callback), которая будет сортироваться с вашим собственным обратным вызовом.