Autor Zpráva
Vilak
Profil
Zdravím. Mám pole v php, ve které mám X čísel. Vím, že tato čísla jsou PŘIROZENÁ ČÍSLA. Jak to mám udělat, aby se mi duplicity přepsali třeba na nejvyšší možné číslo, pokud tam nějaká taková duplicita je?
Např.: Pole "Rank" obsahuje: 1;3;2;5;3;8;6;4;5;3 a chci to udělat tak, aby tam bylo každé číslo právě jednou, jak? Tudíž chci, aby se z duplicit staly nějaká jiná čísla, ale nevím, jak to udělat.

Jen ještě chci dodat, že pořadí prvků musí byt stejné. Má někdo nějaký nápad? :)
Keeehi
Profil
Vilak:
Moc to nedává smysl. Hlavně to, že je ti jedno, na co se to změní. Na co to chceš využívat?
Vilak
Profil
Na pořadí. Ovšem když se někdo splete, ať to udělá nějaké jiné číslo. Nejlépe nejvyšší.
juriad
Profil
function renumber($arr) {
    $next = max($arr) + 1; # toto bude hodnota použitá pro náhrady
    $uniq = array_flip($arr); # převedeme na pole [hodnota => poslední výskyt]
    foreach ($arr as &$el) { # projdeme pole (prvky jsou reference, aby se do nich dalo přiřazovat)
        if ($uniq[$el] !== NULL) { # pokud je v poli $uniq
            $uniq[$el] = NULL; # tak ho od tamtud smažeme
        } else { # druhý a další výskyt
            $el = $next++; # nahradíme za hodnotu větší než maximum a to následně zvětšíme
        }
    }
    return $arr; # pole vrátíme
}

var_dump(renumber([1,3,2,5,3,8,6,4,5,3]));
Vilak
Profil
juriad:
Super. Díky moc! Přesně toto jsem potřeboval. :)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: