Как я могу переместить пустые значения массива в его последнюю позицию?
Например:
$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), которая будет сортироваться с вашим собственным обратным вызовом.