php - 排序和删除重复项?

时间:2010-04-18 22:18:01

标签: php arrays filter multidimensional-array

我有一个看起来像这样的数组:

    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;
}

4 个答案:

答案 0 :(得分: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;
}

对数组进行排序后,您可以使用以下内容过滤带有重复 num 的项目:

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

答案 1 :(得分: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]);
        }
    }

答案 2 :(得分:0)

答案 3 :(得分: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);