Buscar un array por uno de sus valores dentro de otro array en PHP

publicado por: Anonymous

Tengo un array en PHP con una estructura similar a la siguiente (obtenido usando el fech_all() para obtener todas las filas de una tabla):

var_dump() de $miarray

array(3) {
    [0]=> array(3) {
        [0]=> string(1) "1" // option_id
        [1]=> string(9) "site_name" // option_name
        [2]=> string(8) "FullAuth" // option_value
    }
    [1]=> array(3) {
        [0]=> string(1) "2" // option_id
        [1]=> string(8) "home_url" // option_name
        [2]=> string(25) "http://ejemplo.com" // option_value
    }
    [2]=> array(3) {
        [0]=> string(1) "3" // option_id
        [1]=> string(8) "auth_url" // option_name
        [2]=> string(31) "http://ejemplo.com/user/" // option_value
    }
}

Para que se me entienda mejor, cada uno de esos subarrays son una opción almacenada en una base de datos y lo que quiero conseguir es acceder al valor (option_value) de cada una de las opciones tan solo conociendo su nombre (option_name).

Me gustaría conseguir algo así:

function obtenerOpcion($option_name) {
    // Buscar la opción dentro de $miarray
    // return...
}

echo obtenerOpcion("home_url"); // http://ejemplo.com

solución

Si he entendido bien, dado un valor como home_url u otro, quieres obtener el valor que sigue, en este caso: http://ejemplo.com

En base al array que tienes, puedes programar una función como esta:

function getOption ($arraySuperior,$mValue){
    foreach ($arraySuperior as $subArray){
        foreach ($subArray as $k=>$v){
            if ($v==$mValue){
                /*
                    Encontrado el valor, no seguimos iterando sobre el array
                    retornando el dato que se encuentre en la clave 
                    siguiente a donde se encuentre a $mValue
                */
                return $subArray[$k+1];
            }
        }
    }
    return NULL;
}

Probemos la función con varias posibilidades:

$mOption=getOption($arraySuperior,"home_url");
var_dump($mOption);   //string(18) "http://ejemplo.com"

$mOption=getOption($arraySuperior,"site_name");
var_dump($mOption);  //string(8) "FullAuth"

$mOption=getOption($arraySuperior,"fake");
var_dump($mOption);  //NULL

Recomendación

Dado que fetch_all acepta un parámetro para crear arreglos asociativos, sería mejor que crees un array de ese tipo, así podrás acceder al valor de una forma más certera usando el nombre de la columna.

En la respuesta dada se asume que no hay irregularidades en el array (siempre option_value estará después de option_name), si no fuera así, no se obtendría el valor correcto, por eso es siempre más seguro obtener los valores por el nombre del índice y no por el número secuencial.

Si se pasara a fetch_all la bandera para arreglo asociativo, el mismo se crearía así:

$arraySuperior= array(
             array(
                        "option_id" => "1", 
                        "option_name" => "site_name",
                        "option_value" => "FullAuth"
            ),
             array(
                        "option_id" => "2",
                        "option_value" => "http://ejemplo.com",
                        "option_name" => "home_url",
            ),
            array(
                        "option_id" => "3",
                        "option_name" => "auth_url",
                        "option_value" => "http://ejemplo.com/user/"
            )
);

NÓTESE que de forma intencional he puesto un orden distinto en el segundo array.

No habría problema, porque la función va a buscar el valor por el nombre de la clave, sin importar que esté después o antes de option_name:

function getOption ($arraySuperior,$mValue){
    foreach ($arraySuperior as $subArray){
        foreach ($subArray as $k=>$v){
            if ($v==$mValue){
                /*
                    Encontrado el valor, no seguimos iterando sobre el array
                    retornando el dato que se encuentre en la clave 
                    siguiente a donde se encuentre a $mValue
                */
                return $subArray["option_value"];
            }
        }
    }
    return NULL;
}

Además, esto haría el código más portable. Supongamos que se quiere buscar no solamente el option_value, sino que en algunos casos se requiere el option_id. La misma función serviría, agregando un tercer parámetro y una verificación suplementaria sobre $mKey:

function getOption ($arraySuperior,$mValue,$mKey){
    foreach ($arraySuperior as $subArray){
        foreach ($subArray as $k=>$v){
            if ( $v==$mValue && isset($subArray[$mKey]) ){
                /*
                    Encontrado el valor, no seguimos iterando sobre el array
                    retornando el dato que se encuentre en la clave 
                    siguiente a donde se encuentre a $mValue
                */
                return $subArray[$mKey];
            }
        }
    }
    return NULL;
}

Pruebas varias:

$mOption=getOption($arraySuperior,"home_url","option_value");
var_dump($mOption);   //string(18) "http://ejemplo.com"

$mOption=getOption($arraySuperior,"home_url","option_id");
var_dump($mOption);   //string(1) "2"

$mOption=getOption($arraySuperior,"home_url","option_ids");
var_dump($mOption);   //NULL

$mOption=getOption($arraySuperior,"fake","option_id");
var_dump($mOption);   //NULL
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *