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

5

如何将数组中的空值移动到其末尾位置?

例如:

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

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

只要非空值不被排序。也就是说,只有空值会移动到数组的末尾。 我需要的正是我示例中展示的内容。

我认为你选择了错误的答案作为答案... Hakre的答案绝对是最好的方法,显然那对你起作用了。 - Tim S.
6个回答

8
您要寻找的是所有非空字符串("")的值,然后是所有空字符串的值:
$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) ""
}

1
我给你的答案点了赞,因为它简洁、原创且功能最佳。在所有答案中,这是最好的选择。 - Tim S.

6

尝试使用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] => 
)

你想要交换 -11,我认为。此外,这不会保持非空元素的顺序不变。 - Tim
没有意识到 PHP 不支持稳定排序。这里有一个 usort 的稳定版本:https://dev59.com/lW855IYBdhLWcg3wbjnO#4353844 - gintas

6
这个主题中已经有更好/更优秀的答案,但这个也可以:

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

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


1
我压缩了代码示例。顺便说一下:foreach正在迭代一个数组副本,因此您不需要为操作迭代两次。 - hakre

2
这应该可以运行:
function sortempty( $a, $b ) {
    return empty( $a );
}

usort( $array, 'sortempty' );

输出结果 (演示):

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

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


谢谢您的回复,但我得到的结果是这样的数组 Array ( [0] => blue [1] => green [2] => red [3] => [4] => ) 这里的值被排序了。但它应该像这样 ( [0] => green [1] => red [2] => blue [3] => [4] => ) - Raja
@Raja 我认为这是使用 usort() 的副作用。如果您始终返回0,则仍按字母顺序排序。 - Tim S.

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接