Matriz de ejemplo:

Array
(
    [en] => Array
        (
            [active] => 0
            [default_locale] => en_US
        )

    [es] => Array
        (
            [active] => 1
            [default_locale] => es_ES
        )

    [de] => Array
        (
            [active] => 0
            [default_locale] => de_DE
        )

    [fr] => Array
        (
            [active] => 0
            [default_locale] => fr_FR
        )
)

Necesito obtener la clave de la matriz donde activo es 1 . Sé que puedo recorrer la matriz y encontrarla, pero ¿no hay alguien mejor?

Estoy jugando con:

array_search('1', array_column($array, 'active'));

Y en lugar de la tecla con nombre, obtengo su posición numérica, en este ejemplo es 1, pero necesitaría es.

Y finalmente $array[1] no genera nada.

1
RhymeGuy 26 oct. 2017 a las 19:41

3 respuestas

La mejor respuesta

Si no quieres usar para loop. Teniendo en cuenta que solo tiene un idioma activo. Si tiene más de uno, se tomará la primera vez.

$array =  array(
    'en' => array('active' => '0', 'default_locale' => 'en_US',),
    'es' => array('active' => '1','default_locale' => 'es_ES',),
    'de' => array('active' => '0','default_locale' => 'de_DE', ),
    'fr' => array('active' => '0','default_locale' => 'fr_FR', )
);
// get all the keys of your array
$array_keys = array_keys($array);
// serach for active language
$search =  array_search('1', array_column($array, 'active'));
// named key
$named_key = $array_keys[$search]; // returns 'es' in this case.
// print your active array
print_r($array[$named_key]);

Fuera puesto:

Array
(
    [active] => 1
    [default_locale] => es_ES
)
2
Ravinder Reddy 26 oct. 2017 a las 17:21

Además de la gran respuesta de Ravinder Reddy; como sabemos que default_locale contiene parte de la clave en su matriz, simplemente extraiga active e indexe con default_locale y luego tome los primeros 2 caracteres:

$key = substr(array_search('1', array_column($array, 'active', 'default_locale')), 0, 2);

Esta no es una solución general, es específica de esta estructura de matriz y solo devuelve la primera clave donde active = 1 (en).

0
AbraCadaver 26 oct. 2017 a las 17:13

Simplemente usaría algo como este iterador. Funciona, y es lo suficientemente simple como para que no haya un proyecto de investigación ;-)

<?php // demo/temp_rhymeguy.php
/**
 * https://stackoverflow.com/questions/46959599/php-numeric-value-as-key-in-associative-array
 */
ini_set('display_errors', TRUE);
error_reporting(E_ALL);

echo '<pre>';

// COLLECT RESULTS HERE
$actives = [];

// TEST DATA
$main = Array
(
    'en' => Array
        (
            'active' => 1,
            'default_locale' => 'en_US'
        ),

    'es' => Array
        (
            'active' => 1,
            'default_locale' => 'es_ES'
        ),

    'de' => Array
        (
            'active' => 0,
            'default_locale' => 'de_DE'
        ),

    'fr' => Array
        (
            'active' => 0,
            'default_locale' => 'fr_FR'
        ),
);

foreach ($main as $key => $sub_array)
{
    if ($sub_array['active'] == 1) $actives[] = $key;
}
// SHOW THE ORIGINAL AND THE RESULTS
var_dump($main, $actives);
-2
Ray Paseur 26 oct. 2017 a las 16:56