2012-04-20 20 views
8

Soy nuevo en PHP y estoy tratando de convertir una función de Javascript simple en una función de PHP. Hasta ahora sé que solo convierto las variables, necesito ayuda con la función de clasificación y el filtro de matriz. ¡Gracias por cualquier ayuda!Convirtiendo la función de Javascript en una función de PHP

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

Mi medio de conversión:

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

Es necesario ordenar un arreglo? – Goldie

+1

¿cómo se ha votado al alza? -1 escribiendo en 'php sort' en google dará miles de resultados. – dm03514

+0

¿qué estás ordenando? –

Respuesta

3

de alcance no acaba de funcionar como JavaScript; no puede simplemente referirse a $number dentro de su función de devolución de llamada, porque no tiene una cadena de alcance.

que o bien tienen para que sea mundial (no se recomienda pero simple):

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

O usted podría utilizar el operador use (una solución elegante):

<?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 para 'usar' ... –

+0

Esto funcionó para mí, Aprecio su ayuda con esto. Estudiaré y aprenderé de tu código. Gracias. –

3

Eres bastante estrecha, el alcance variable en PHP es un poco diferente:

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

Básicamente, el diferente es use ($number) y usted don' Necesito nombrar la función de temperatura.

+0

Actualmente estoy buscando el uso de 'uso' ... Tengo un error 'T_FUNCTION' inesperado. Como dije, soy novato, así que estoy tratando de comprender el alcance variable. Creo que debido a que $ number y $ rollArray están en una función dentro de otra función, de alguna manera no se está pasando a la función de filtro ... ¡Agradezco la ayuda de todos! –

+0

Para filas de datos grandes no es necesario hacer un array_filter, porque pasa por toda la matriz, ¿no crees que es mejor usar algún tipo de algoritmo bastante conocido? :) – devdRew

+0

@JoeFisher si obtiene 'inesperado T_FUNCTION' con este código, probablemente esté en PHP <5.3. Necesitarás usar 'create_function()' que lo hará más interesante ... Prueba 'function closeRoll ($ number) {$ rollArray = Array (36, 48, 60, 72); $ closer = array_filter ($ rollArray, create_function ('$ rollArray', 'return $ rollArray -'. $ number. '> = 0;')); devuelve $ más cercano; } ' – DaveRandom

0

Prueba este

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

Así que si entiendo la JavaScript correctamente, esa función devuelve el valor de coincidencia más cercano en rollArray que es mayor que el parámetro dado number?

Aquí es mi solución a ella:

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

Estás en el camino correcto cuando se utiliza array_filter(). Sin embargo, al darle una función anónima como devolución de llamada, se topa con el primer problema de JavaScript vs PHP: el alcance.

En las funciones de PHP no se comparte automáticamente el alcance donde están definidas. Si necesita usar algo del alcance actual, debe llevarlo con la palabra clave use.

Última uso reset() para extraer el primer valor de la matriz ordenada, que debe ser la más cercana coincidente. No puede usar $rollArray[0] porque array_filter() conserva las claves y, por lo tanto, 0 puede que ya no existan.

0

Aquí está el ejemplo de optimizar la búsqueda, no es recta, pero utilizando sus cerebros ... :)

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

?> 
Cuestiones relacionadas