php - сортировать и удалять дубликаты? - PullRequest
1 голос
/ 19 апреля 2010

У меня есть массив, который выглядит так:

    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 и не могу получить пример usort с php.net, работающий здесь. Это просто не похоже на сортировку ... Я также пытаюсь удалить элемент массива, если это дубликат и , чье значение 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 ]

2 голосов
/ 19 апреля 2010

В вашей функции сравнения $a и $b являются элементами вашего массива. Чтобы отсортировать элементы по num , используйте это:

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

И для сортировки по число , а затем по 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 голос
/ 19 апреля 2010

Для сортировки:

    __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]);
        }
    }
0 голосов
/ 06 января 2017
$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);
0 голосов
/ 19 апреля 2010

Использование array_unique() и sort()

...