2012-06-22 19 views
10

Si tengo una matriz:obtener el primer valor no nulo de la matriz PHP

Array 
(
    [0] => 
    [1] => a 
    [2] => b 
    [3] => c 
) 

Y quiero obtener el primer valor no nulo de la matriz, en este caso "a". ¿Cómo podría hacer eso agradable y fácilmente?

+0

por agradable y fácil, me refería a un enfoque a corto. –

Respuesta

32

No está seguro acerca agradable y fácil. Sin embargo, un enfoque a corto podría ser:

$first = current(array_filter($sparse_array)); 

Dónde array_filter extraerá que los "Truthy" valores, saltándose entradas vacías y falsas. Mientras que current simplemente le da la primera de esas entradas restantes.

+2

Desafortunadamente, "truthy" también filtra cadenas vacías, falsos booleanos y ceros numéricos ... de lo contrario, la mejor solución si el OP quiere esa lógica –

+1

Incluso podría agregar una devolución de llamada personalizada a 'array_filter()' para filtrar '' null' valores. También solo una nota, 'current()' espera que su parámetro sea pasado por referencia, por lo que actualmente esto emitiría un aviso/advertencia de "estándares estrictos". – nickb

+0

Como alternativa para las diversas interpretaciones de veracidad, se podría aplicar una función de decisión: '... (array_filter ($ arr," strlen "))' – mario

2

Bueno, podría intentar esto:

foreach($array as $x) { 
    if($x) break; 
} 
if($x) { 
    // $x is the first non-null value 
} 
else { 
    // There were no non-null values 
} 
3
function getFirstNotNull($array) { 
    foreach($array as $val) { 
     if(!is_null($val) || !$val) return $val; 
    } 
} 
+0

En la segunda línea, debe ser '$ array' no' $ arrea'. –

4
function get_first_not_null($array){ 
    foreach($array as $v){ 
    if($v !== null){ 
     return $v; 
    } 
    } 
    return null; 
} 
3
$res = null; 
foreach ($arr as $v) { 
    if ($v !== null) { 
     $res = $v; 
     break; 
    } 
} 
+0

Más código que la solución de Mario, pero sin dudas corre más rápido, y también capturará valores de falsey no nulos. – Blazemonger

1

me gustaría utilizar array_reduce

$firstNonNull = array_reduce($array, function($v, $w) { 
    return $v ? $v : (isset($w) ? $w : FALSE); 
}); 
Cuestiones relacionadas