Hoe de redeclare php-functie te stoppen door ergens anders heen te gaan

Ik heb in principe een PHP-functie die zich in een gigantische foreach-instructie bevindt en moet in die foreach zijn omdat het waarden uit de lus gebruikt.

foreach ($x as $y) {

...

            function sortq($a, $b){
                if ((int)$a->id == (int)$b->id) {
                    return 0;
                }
                return ((int)$a->id < (int)$b->id) ? -1 : 1;
            }

            usort($sort, 'sortq');

...

}

Hoe verwijder ik deze functie in een generieke klasse of methode, zodat ik dit een onbeperkt aantal keren kan noemen? Ik probeerde de 'klassen'-route, maar gaf vervolgens opnieuw les in de foreach-lus: D

Help alstublieft! Erg bedankt

0
Nee, het gebruikt geen waarden uit de lus.
toegevoegd de auteur Boann, de bron
Heb je geprobeerd om het naar de buitenkant van een andere functie/besturing te verplaatsen?
toegevoegd de auteur jprofitt, de bron
Als je de functie uit de foreach verwijdert, moet je nog steeds werken (heb ik gelijk?)
toegevoegd de auteur ajreal, de bron

1 antwoord

Het inpakken van de functiedefinitie in een function_exists controle zal werken:

if (!function_exists('sortq')) {
    function sortq($a, $b) { ... }
}

Als je kunt vertrouwen op minimaal PHP 5.3+, moet je een sluiting :

usort($sort, function($a, $b) {
    if ((int)$a->id == (int)$b->id) {
        return 0;
    }
    return ((int)$a->id < (int)$b->id) ? -1 : 1;
});

Bewerken: eigenlijk is de definitie van de vergelijkingsfunctie vereist door usort zegt:

De vergelijkingsfunctie moet een geheel getal kleiner dan, gelijk aan of groter dan nul retourneren als het eerste argument wordt beschouwd als respectievelijk kleiner dan, gelijk aan of groter dan het tweede.

Dus je kunt die functie vereenvoudigen tot gewoon:

function ($a, $b) { return (int)$a->id - (int)$b->id; }
1
toegevoegd