Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-如何将数组的空值移动到其最后位置_Php_Arrays - Fatal编程技术网

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

PHP-如何将数组的空值移动到其最后位置,php,arrays,Php,Arrays,如何将数组的空值移动到其最后位置 例如: $givenArray = array( 0=>'green', 1=>'', 2=>'red', 3=>'', 4=>'blue' ); $requiredArray = arr

如何将数组的空值移动到其最后位置

例如:

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

$requiredArray = array(
                       0=>'green',
                       1=>'red',
                       2=>'blue',
                       3=>'',
                       4=>'' 
                      );
前提是不应对非空值进行排序。它应该保持原样,即只有空值应该移动到数组的末尾

我需要的正是我的示例所显示的内容。

有一个函数将使用您自己的自定义回调进行排序。

尝试使用

它给出了():

这应该起作用:

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

usort( $array, 'sortempty' );
输出():


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

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

$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) ""
}
这样做的好处是它保留了key=>值关联。如果需要对按键重新编号,只需应用以下功能:

$requiredArray = array_values($requiredArray);
这将使其成为您所需的布局():


在这条线索中已经有了更好/更优雅的答案,但这同样有效:

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

我想你想交换
-1
1
。而且,这不会使非空元素保持相同的顺序。我没有意识到PHP不会进行稳定的排序。这是usort的一个稳定版本:非常感谢您的及时回复。感谢您的回复,但我得到的结果是这样的数组([0]=>蓝色[1]=>绿色[2]=>红色[3]=>[4]=>)这里的值正在排序。但是它应该是这样的([0]=>绿色[1]=>红色[2]=>蓝色[3]=>[4]=>)@Raja我认为这是使用
usort()的副作用。如果您始终返回0,它仍然按字母顺序排序。非常感谢您的及时帮助。我对您的答案投了更高的票,因为它简单、新颖、功能最佳。在所有答案中,这是最好的方式。感谢分享您的想法,我认为您选择了错误的答案作为答案。。。Hakre的答案绝对是最好的方法,显然这对您来说确实有效。我压缩了代码示例。仅供参考:Foreach正在对数组副本进行迭代,因此不需要对操作进行两次迭代。
$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) ""
}
$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);