2012-02-22 62 views
2

如何將數組的空值移動到最後位置?PHP - 如何將數組的空值移動到最後位置

例如:

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

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

提供該非空值不應進行排序。它應該保持原樣,即只有空值應該移動到數組的末尾。

我需要什麼我的例子顯示。

+0

我認爲你選擇了錯誤的答案作爲答案...... Hakre的答案絕對是最好的選擇,顯然這對你很有用。 – 2012-02-23 08:20:18

回答

5

有這更好/更優雅的答案線程已經,但是這也工作:

//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 demo

+1

我壓縮了代碼示例。僅供參考:Foreach正在迭代數組副本,因此您不需要爲操作迭代兩次。 – hakre 2012-02-23 10:20:30

+0

謝謝你,聰明的東西。 – jon 2012-02-23 10:27:08

+0

感謝大東西...它太好了.. – Raja 2012-02-24 10:38:25

0

usort($array, $callback)功能,將與您自己的自定義回調進行排序。

+0

感謝分享你的想法 – Raja 2012-02-23 05:54:34

4

嘗試使用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] => 
) 
+0

你想交換'-1'和'1',我想。另外,這不會以相同的順序保留非空元素。 – Tim 2012-02-22 13:18:02

+0

沒有意識到PHP沒有做穩定的排序。這裏是一個穩定版本的usort:http://stackoverflow.com/a/4353844/1220966 – gintas 2012-02-22 13:23:15

+0

你根本不需要usort:http://stackoverflow.com/a/9395734/367456 – hakre 2012-02-22 13:31:34

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

非常感謝您的回答您的回覆 – Raja 2012-02-23 05:40:22

2

這應該工作:

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

usort($array, 'sortempty'); 

輸出(Demo):

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

usort()允許您使用用戶定義的函數對數組進行排序。如果$a是空的,我將返回。如果它是空的,則返回1,使值$a在數組中向右(或向下)移位。

+0

謝謝,但我得到的結果類似這樣的陣列 陣列 ( [0] =>藍色 [1] =>綠色 [2] =>紅色 [ 3] => [4] => )這裏的值正在排序。但它應該是這樣的( [0] =>綠 [1] =>紅色 [2] =>藍色 [3] => [4] => ) – Raja 2012-02-22 13:29:01

+0

@Raja我認爲這是一個側 - 使用'usort()'的效果。如果您始終返回0,則它仍然按字母順序排序。 – 2012-02-22 13:53:54

+0

非常感謝您的及時幫助。 – Raja 2012-02-23 05:54:18

5

你是第一個找不是一個空字符串("")所有的值,然後將所有的值是一個空字符串:

$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) "" 
} 
+0

爲了簡單,原創性和最佳功能,我提高了您的答案。在所有答案中,這是最好的選擇。 – 2012-02-22 13:56:35

+0

@Hakre,太棒了!非常感謝。它的工作原理與我的預期完全一致。 – Raja 2012-02-23 05:39:22

相關問題