2010-04-18 89 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);