2012-04-20 10 views
8

Ich bin neu in PHP und ich versuche, eine einfache Javascript-Funktion in eine PHP-Funktion zu konvertieren. Bis jetzt weiß ich nur die Variablen zu konvertieren, ich brauche Hilfe mit der Sortierfunktion und Array-Filter. Danke für jede Hilfe!Konvertieren von JavaScript-Funktion in eine PHP-Funktion

var closeRoll = function(number) { 
    var rollArray = [36, 48, 60, 72]; 
    var closest = rollArray.filter(function(ele){ 
    return ele - number >= 0 
    }).sort()[0]; 
    return closest; 
}; 

Meine Hälfte Umwandlung:

function closeRoll($number) { 
    $rollArray = Array(36, 48, 60, 72); 
    $closest = array_filter($rollArray, function temp($rollArray) { 
    return $rollArray - $number >= 0; 
    }); //.sort()[0]; 
    return $closest; 
}; 
+0

Sie benötigen ein Array zu sortieren? – Goldie

+1

Wie wurde das upvoted? -1 in 'PHP Sortierung' in Google eingeben gibt Tausende von Ergebnissen. – dm03514

+0

Woran sortieren Sie? –

Antwort

3

Scoping nicht ganz wie JavaScript funktioniert; Sie können innerhalb Ihrer Callback-Funktion nicht einfach auf $number verweisen, da es keine Gültigkeitsbereichskette hat.

entweder Sie müssen es global machen (nicht empfohlen, aber einfach):

<?php 
function doFilter($element) { // this could still be anonymous, but doesn't have to be 
    return $element - $GLOBALS['number'] >= 0; 
} 

function closeRoll($number) { 
    $GLOBALS['number'] = $number; 
    $rollArray = Array(36, 48, 60, 72); 
    $closest = array_filter($rollArray, 'doFilter'); 
    return $closest; 
}; 
?> 

Oder Sie könnten den use Operator (eine elegante Lösung) verwenden:

<?php 

function closeRoll($number) { 
    $rollArray = Array(36, 48, 60, 72); 
    $closest = array_filter($rollArray, function($element) use ($number) { 
    return $element - $number >= 0; 
    }); 
    return $closest; 
}; 

?> 
+0

+1 für 'verwenden' ... –

+0

Dies funktionierte für mich, Ich danke Ihnen für Ihre Hilfe. Ich werde lernen und von Ihrem Code lernen. Vielen Dank. –

3

Sie sind ziemlich nah dran, die Variable Umfang in PHP ist ein wenig anders:

function closeRoll($number) { 
    $rollArray = Array(36, 48, 60, 72); 
    $closest = array_filter($rollArray, function($rollArray) use ($number) { 
     return $rollArray - $number >= 0; 
    }); //.sort()[0]; 
    return $closest; 
} 

Grundsätzlich ist die andere ist use ($number) und Sie don‘ t müssen Sie die Temp-Funktion benennen.

+0

Ich bin derzeit auf der Suche nach 'Verwendung' ... Ich bekomme 'eine unerwartete T_FUNCTION' Fehler. Wie ich schon sagte, ich bin ein Noob, also versuche ich den variablen Bereich zu verstehen. Ich denke, da $ number und $ rollArray in einer Funktion innerhalb einer anderen Funktion sind, einige, wie nicht an die Filterfunktion übergeben wird. Ich schätze jede Hilfe! –

+0

Für große Datenzeilen ist es nicht notwendig, einen array_filter zu erstellen, weil er das gesamte Array durchläuft. Denkst du nicht, dass es besser ist, einen ziemlich bekannten Algorithmus zu verwenden? :) – devdRew

+0

@JoeFisher Wenn Sie 'unerwartete T_FUNCTION' mit diesem Code bekommen, sind Sie wahrscheinlich auf PHP <5.3. Du wirst 'create_function()' verwenden müssen, was das interessanter macht ... Probiere 'function closeRoll ($ number) {$ rollArray = Array (36, 48, 60, 72); $ engste = array_filter ($ rollArray, create_function ('$ rollArray', 'zurück $ rollArray -'. $ number. '> = 0;')); Rückkehr $ am nächsten; } ' – DaveRandom

0

Versuchen Sie, diese

function closeRoll($number) { 
    $rollArray = array(36, 48, 60, 72); 
    $closest = array_filter($rollArray, function ($rollArray) use ($number) { return $rollArray - $number >= 0; }); 

    if (!empty($closest)) 
    { 
     sort($closest); 
     return array_shift($closest); 
    } 
    return null; 
} 
0

Also, wenn ich das verstehen JavaScript korrekt, diese Funktion gibt den am nächsten passenden Wert in rollArray zurück, der größer ist als der angegebene number Parameter?

Hier ist meine Lösung es:

function closeRoll($number) { 
    $rollArray = array(36, 48, 60, 72); 

    $rollArray = array_filter(
     $rollArray, 
     function($value) use ($number) { 
      return $value - $number >= 0; 
     } 
    ); 

    return reset(sort($rollArray)); 
} 

Sie auf dem richtigen Weg sind, wenn array_filter() verwenden. Bei einer anonymen Funktion als Callback stoßen Sie jedoch auf das erste JavaScript vs PHP-Problem - Scoping.

In PHP-Funktionen teilt nicht automatisch den Bereich, in dem sie definiert sind. Wenn Sie etwas aus dem aktuellen Bereich benötigen, müssen Sie es mit dem Schlüsselwort use mitbringen.

Zuletzt benutze ich reset(), um den ersten Wert des sortierten Arrays herauszuziehen, der dem am nächsten passenden sein sollte. Sie können $rollArray[0] nicht verwenden, da array_filter() Schlüssel beibehält und 0 daher möglicherweise nicht mehr vorhanden ist.

0

Hier ist das Beispiel, um die Suche zu optimieren, nicht gerade, sondern mit Ihrem Gehirn ... :)

<?php 

function find($number, array $a) 
{ 
    $len = count($a); 

    if ($len == 0) 
    { 
     return null; 
    } 
    elseif ($len == 1) 
    { 
     return array_shift($a); 
    } 

    sort($a, SORT_NUMERIC); 

    $first = array_slice($a, 0, (int) ($len/2)); 
    $second = array_slice($a, (int) ($len/2)); 

    // No need to check on isset because of if ($len == 0) elseif ($len == 1) 
    if ($second[0] == $number) 
    { 
     return $number; 
    } 

    $index = count($first) - 1;  
    if ($first[$index] == $number) 
    { 
     return $number; 
    } 

    return abs($number - $first[$index]) <= abs($number - $second[0]) ? find($number, $first) : find($number, $second); 
} 

$a = array(10, 99, 51, 201, 999, 500, 555, 618); 
$n = 75; 

echo find($n, $a); 

?> 
Verwandte Themen