2012-09-04 16 views
7

Estoy intentando crear una función para iniciar date_compare() que es una función usort para una matriz y clave específicas.¿Pasar argumentos de función a una función interna?

function init_date_compare($key, $array) { 
    $key2 = $key; 
    function date_compare($a, $b) { 
     global $key2; 
     $t1 = strtotime($a[$key2]); $t2 = strtotime($b[$key2]); 
     return $t2 - $t1; 
    } 
    usort($array, "date_compare"); 
} 
$arr = array(array("Aug-2-2012"), array("June-2-2012")); 
$arr = init_date_compare(0, $arr); 
print_r($arr); 

Este salidas:

Notice: Undefined index: in... 

(Así que, básicamente nulo, el alcance no funcionó).

No estoy seguro de cómo funciona el alcance con las funciones dentro de las funciones, pero si recuerdo bien, es posible. Intenté arrojar algunos global sy inicializando $key2, pero no puedo hacer que esto funcione.

+0

sería útil si 'usort' y sus parientes podrían pasar argumentos a la devolución de llamada, eh. –

Respuesta

4

El motivo por el que su código no funciona es porque global $key2; dentro de la función date_compare() no lo buscará dentro del alcance init_date_compare(); más bien, esperará encontrarlo dentro del alcance global.

Además, la matriz se debe pasar por referencia (es decir, &$array) a través de los parámetros de la función o la matriz debe devolverse desde ella.

cierres harían de éste un conjunto mucho más agradable (PHP> = 5.3):

function init_date_compare($key, &$array) 
{ 
    usort($array, function(array $a, array $b) use ($key) { 
     $t1 = strtotime($a[$key]); $t2 = strtotime($b[$key]); 
     return $t2 - $t1; 
    }); 
} 

Otra forma es mediante el uso de un objeto de encapsular el estado:

class DateComparer 
{ 
    private $key; 

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

    public function compare(array $a, array $b) 
    { 
     $t1 = strtotime($a[$this->key]); $t2 = strtotime($b[$this->key]); 
     return $t2 - $t1; 
    } 
} 

function init_date_compare($key, &$array) 
{ 
    usort($array, array(new DateComparer($key), 'compare')); 
} 
+0

Veo que global es inútil en este caso. Nunca antes había visto el código que usaste en tu primer ejemplo, pero lo probaré ahora. –

+0

¡Gracias funcionó! –

1

Por supuesto que Jacks respuesta es la MANERA CORRECTA de hacer las cosas, pero en caso de que se pregunte por qué no funcionó en primer lugar:
declarando $key2 como la variable global es solo un problema, el otro problema es que la función init_date_compare no devuelve el sor ted array.
El siguiente código funciona:

$key2=0; 

function init_date_compare($key, $array) { 
    global $key2; 
    $key2 = $key; 
    function date_compare($a, $b) { 
     //global $key2; 
     $t1 = strtotime($a[$key2]); $t2 = strtotime($b[$key2]); 
     return $t2 - $t1; 
    } 
    usort($array, "date_compare"); 
    return $array; 
} 
$arr = array(array("Aug-2-2012"), array("June-2-2012")); 
$arr = init_date_compare(0, $arr); 
print_r($arr); 
+0

Gracias, nunca pensé en eso. –

Cuestiones relacionadas