PHP-如何将数组的空值移动到最后一个位置


PHP - How to move the empty values of an array to its last positions

如何将数组的空值移动到最后一个位置?

例如:

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

前提是不应对非空值进行排序。它应该是原样,即只有空值应该移动到数组的末尾。

我需要的正是我的例子。

您首先要查找所有不是空字符串("")的值,然后查找所有是空字符串的值:

$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);

这将把它变成你需要的布局(演示):

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

在这个线程中已经有了更好/更优雅的答案,但这也很有效:

//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演示

尝试使用usort

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

哪个给出(演示):

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

这应该有效:

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

输出(演示):

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

usort()允许您使用用户定义的函数对数组进行排序。如果$a是否为空,则返回。如果为空,则返回1,使值$a在数组中向右(或向下)移动。

$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);

有一个usort($array,$callback)函数,它将使用您自己的自定义回调进行排序。