2010-04-18 114 views
1

我有一個數組,看起來像這樣:PHP - 排序和刪除重複?

Array (
     [0] => Array (
       num => 09989, 
       dis => 20 
      ) 
     [1] => Array (
       num => 09989, 
       dis => 10 
      ) 
     [2] => Array (
       num => 56676, 
       dis => 15 
      ) 
     [3] => Array (
       num => 44533, 
       dis => 20 
      ) 
     [4] => Array (
       num => 44533, 
       dis => 50 


) 
) 

首先,我試圖通過NUM對它們進行排序,並且似乎無法擺脫php.net在這裏工作的usort例子。它似乎沒有排序...我也試圖刪除數組元素,如果它是一個重複的其dis值高於另一個。

因此,基於上面的例子中,我試圖創建:

Array (
    [0] => Array (
      num => 09989, 
      dis => 10 
     ) 
    [1] => Array (
      num => 44533, 
      dis => 20 
     ) 
    [2] => Array (
      num => 56676, 
      dis => 15 
     ) 

) 

這是php.net代碼:

function cmp($a, $b) 
{ 
    if ($a == $b) { 
     return 0; 
    } 
    return ($a < $b) ? -1 : 1; 
} 

回答

2

在您的比較函數中,$a$b都是您的數組的項目。要通過NUM對項目進行排序,使用此:

function cmp($a, $b) { 
    if ($a['num'] == $b['num']) { 
     return 0; 
    } 
    return ($a['num'] < $b['num']) ? -1 : 1; 
} 

而且通過NUM,然後進行排序DIS,使用此:

function cmp($a, $b) { 
    if ($a['num'] == $b['num']) { 
     if ($a['dis'] == $b['dis']) { 
      return 0; 
     } 
     return ($a['dis'] < $b['dis']) ? -1 : 1; 
    } 
    return ($a['num'] < $b['num']) ? -1 : 1; 
} 

排序陣列後,你可以過濾與重複項目與此:

for ($i=1, $j=0, $n=count($array); $i<$n; ++$i) { 
    if ($array[$i]['num'] == $array[$j]['num']) { 
     unset($array[$i]); 
    } else { 
     $j = $i; 
    } 
} 

而且都在一起:

$array = array(
    array('num' => '09989', 'dis' => '20'), 
    array('num' => '09989', 'dis' => '10'), 
    array('num' => '56676', 'dis' => '15'), 
    array('num' => '44533', 'dis' => '20'), 
    array('num' => '44533', 'dis' => '50') 
); 

function cmp($a, $b) { 
    if ($a['num'] == $b['num']) { 
     if ($a['dis'] == $b['dis']) { 
      return 0; 
     } 
     return ($a['dis'] < $b['dis']) ? -1 : 1; 
    } 
    return ($a['num'] < $b['num']) ? -1 : 1; 
} 
usort($array, 'cmp'); 

for ($i=1, $j=0, $n=count($array); $i<$n; ++$i) { 
    if ($array[$i]['num'] == $array[$j]['num']) { 
     unset($array[$i]); 
    } else { 
     $j = $i; 
    } 
} 
var_dump($array); 
+0

試圖使用這個,但我只是得到一個無效的比較函數錯誤 – c41122ino 2010-04-19 01:00:23

+0

@ c41122ino:你是什麼意思,你得到一個無效的比較函數? PHP會這麼說嗎? – Gumbo 2010-04-19 06:53:08

1

對於排序:

__retry: 
    for ($j=1; $j < sizeof($your_array[$i]); $j++) 
    { 
     if (cmp($your_array[$i][$j-1],$your_array[$i][$j])) // your written cmp for your object structure 
     { 
      $temp = $your_array[$i][$j-1]; 
      $your_array[$i][$j-1] = $your_array[$i][$j]; 
      $your_array[$i][$j] = $temp; 
      goto __retry; 
     } 
    } 

你的比較功能:

function cmp($a, $b) 
{ 
    return $a['num'] < $b['num']; 
} 

對於刪除相同:

__retry: 
    for (%j=1; $j < sizeof($your_array[$i]); $j++) 
    { 
     if (!cmp($your_array[$i][$j-1],$your_array[$i][$j]) && !cmp($your_array[$i][$j],$your_array[$i][$j-1])) 
     { 
      $temp = $your_array[$i][$j-1] = array_pop($your_array[$i]); 
     } 
    } 
+1

爲什麼不使用'sort'來排序數組?目前你的代碼是殘酷的,相當難讀的(我不確定它是否有效)。 – Yacoby 2010-04-18 22:46:05

+0

好吧,試圖實現你在這裏發佈的結果:解析錯誤:語法錯誤,意外':'它不喜歡__retry:... – c41122ino 2010-04-18 22:52:00

+0

刪除__retry。 替換goto __retry;到$ j = 1 – Svisstack 2010-04-19 10:23:42

0
$firstArray=array(5,6,7,7,1,6,1,5); 

//sort the first array 
sort($firstArray); 
print_r($firstArray); 

//get the number of elements 
$arrayCount=count($firstArray); 

//create a second array 
$secondArray=array(); 

//copy the first item to the second array 
array_push($secondArray,$firstArray[0]);  

//copy into the second array if there is not twice the same item 
for ($j=1;$j<$arrayCount;$j++) 
{ 
    if($firstArray[$j-1]!=$firstArray[$j]) array_push($secondArray,$firstArray[$j]);    
} 

//that's all! 
print_r($secondArray);