php - sıralamak ve çiftleri silmek?

3 Cevap php

Şöyle bir dizi var:

    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


)  
)

Birincisi, ben num göre sıralamak çalışıyorum, ve php.net Burada çalışırken usort örnek almak gibi olamaz. Bu sadece and olan dis değeri diğerinden daha yüksek bir çift eğer ben de dizi elemanı silmek için çalışıyorum ... sıralama gibi görünmüyor.

Yani, yukarıdaki örnekte dayalı, ben oluşturmak çalışıyorum:

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

)

Bu php.net gelen kodu:

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

3 Cevap

Karşılaştırma fonksiyonu $a ve $b dizinizin her iki öğe vardır. Tarafından öğeleri sıralamak için num, bu kullanın:

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

Ve num ve o zaman dis, bu kullanmak göre sıralamak için:

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

Diziyi sıralama sonra iki nüsha num bu ile birlikte öğeleri filtreleyebilirsiniz:

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

Ve birlikte her şey:

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

Tür için:

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

Sizin fonksiyonunu karşılaştırın:

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

Için aynı silin:

    __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]);
        }
    }