2011-12-06 6 views
73

Básicamente utilizo esta función útil para el procesamiento de filas db (cerrar un ojo en DOP y/o otras cosas)Acceso a la variable fuera de uso de función anónima como params

function fetch($query,$func) { 
    $query = mysql_query($query); 
    while($r = mysql_fetch_assoc($query)) { 
     $func($r); 
    } 
} 

Con esta función simplemente puedo hacer:

fetch("SELECT title FROM tbl", function($r){ 
    //> $r['title'] contains the title 
}); 

Digamos que ahora necesito concatenar todos $r['title'] en una var (esto es solo un ejemplo).

¿Cómo podría hacer eso? Estaba pensando en algo como esto, pero no es muy elegante:

$result = ''; 
fetch("SELECT title FROM tbl", function($r){ 
    global $result; 
    $result .= $r['title']; 
}); 

echo $result; 

Respuesta

143

usted tiene que utilizar como usedescribed in docs:

Los cierres también pueden heredar las variables del ámbito padre. Cualquiera de estas variables debe declararse en el encabezado de la función. Heredar variables del ámbito principal no es lo mismo que usar variables globales . Las variables globales existen en el ámbito global, que es el mismo sin importar qué función se esté ejecutando.

Código:

$result = ''; 
fetch("SELECT title FROM tbl", function($r) use (&$result) { 
    $result .= $r['title']; 
}); 

Pero cuidado (tomado de uno de los comentarios en enlace anterior):

uso() parámetros son el enlace anticipado - que utilizan el valor de la variable en la punto donde se declara la función lambda, en lugar del punto donde se llama a la función lambda (enlace tardío).

+0

¿No debería eliminarse esa desaceleración global? –

+0

Sí, por supuesto, gracias por señalar :) – Xaerxess

+13

+1 para enfatizar el 'enlace anticipado'. Sin embargo, supongo que en el ejemplo anterior cuando 'use (& $ result)' se pasa por referencia, ¿realmente no importa? –

0

¿Qué hay de reescribir 'fetch' para llamar a $ func solo una vez?

function fetch($query,$func) { 
    $query = mysql_query($query); 
    $retVal = array(); 
    while($r = mysql_fetch_assoc($query)) { 
     $retVal[] = $r; 
    } 
    $func($retVal); 
} 

De esta manera, ¿podría llamar $ func una sola vez y volver a procesar la matriz una vez que se haya obtenido? No estoy seguro del rendimiento, aunque llamar 200 veces a una función no suena como una buena idea.

+0

no. este es un asesino de rendimiento – dynamic

+0

Sí, tienes razón. Sin embargo, puedes usar mysql_fetch_row() en lugar de mysql_fetch_assoc() si estás interesado en ganar algunos ms aquí y allí ... es terriblemente difícil de tratar ya que tienes que saber la posición de tus columnas. Al hacerlo, pasa de 0.205 a 0.180 en 2000 solicitudes de 30 filas cada una. – user103307

Cuestiones relacionadas