Sortați folosind comparatorul "create_function" în PHP înainte de 5.3?

Nu am folosit niciodată funcții anonime în PHP înainte, dar am găsit o bucată de cod care utilizează unul pentru a sorta obiecte

usort($numTurnsPerUser,build_sorter('turns'));

function build_sorter($key) {
    return function ($a, $b) use ($key) {
        return strnatcmp($a[$key], $b[$key]);
    };
}

Acest cod va sorta un obiect cu o cheie (trec în "transformă"). De exemplu, un obiect care arată astfel: (scris în JSON, doar pentru citire)

$numTurnsPerUser = {
    "31":{
        "turns":15,
        "order":0
    }, "36":{
        "turns":12, 
        "order":1
    }, "37":{
        "turns":14, 
        "order":2
    }
}

vor fi sortate într-un obiect care arată astfel:

$numTurnsPerUser = {
    "36":{
        "turns":12,
        "order":1
    }, "37":{
        "turns":14,
        "order":2
    }, "31":{
        "turns":15, 
        "order":0
    }
}

Acest lucru a funcționat foarte bine pe serverul meu local, care rulează PHP 5.3.0, dar nu funcționează pe serverul meu online, care rulează "php5" - nu găsesc alte informații decât asta. Am o eroare

Eroare parsare: eroare de sintaxă, T_FUNCTION neașteptată

I read that PHP < 5.3 cannot use anonymous functions and must use create_function, but the "use" part of the anonymous function has me stumped. Could someone please explain to me what that "use" part of the function is, or better yet, how I can "translate" this to the create_function parameters needed?

5
"care rulează" php5 "- nu găsesc alte informații decât asta." puteți afla versiunea executând PHP --version în linia de comandă. Sau în codul scriptului dvs. PHP, punerea phpinfo (); va tipări tone de informații despre instalarea dvs. PHP
adăugat autor user102008, sursa
@pst dacă există o modalitate mai bună de a defini această funcție în afară de create_function la aceasta - nu pot folosi o funcție anonimă
adăugat autor allicarn, sursa

2 răspunsuri

Ai putea face așa:

Class Sorter {
  private $key;

  public function __construct($key) {
    $this->key = $key;
  }

  public function sort($a, $b) {
    return strnatcmp($a[$this->key], $b[$this->key]);
  }
}

usort($numTurnsPerUser, array(new Sorter('key_b'), 'sort'));
3
adăugat

O traducere literală (din moment ce ați solicitat expres create_function ):

function build_sorter($key) {
    return create_function('$a, $b', '$key = '.var_export($key, true).';
        return strnatcmp($a[$key], $b[$key]);
    ');
}

Aveți grijă dacă executați acest lucru mult, deoarece de fiecare dată când apelați create_function , adăugați o funcție globală care nu este niciodată distrusă. Dacă faceți acest lucru prea mult, va rămâne fără memorie.

0
adăugat
PHP România, Moldova
PHP România, Moldova
173 participanți

Vorbim despre Yii, Laravel, Symphony, MySQL, PgSQL, WP, OpenCart... Pentru confort, opriți notificările. Parteneri: https://ciupacabra.com @js_ro @node_ro @python_ro @seo_ro @Romania_Bot Offtop: @holywars_ro Joburi: @php_job @Grupuri_IT