Tengo una matriz como sigue

array(2) {
  ["operator"] => array(2) {
    ["qty"] => int(2)
    ["id"] => int(251)
  }
  ["accessory209"] => array(2) {
    ["qty"] => int(1)
    ["id"] => int(209)
  }
  ["accessory211"] => array(2) {
    ["qty"] => int(1)
    ["id"] => int(211)
  }
}

Estoy tratando de encontrar una manera de verificar un valor de identificador existe dentro de la matriz y de retorno de tipo bool. Estoy tratando de encontrar una manera rápida y que no requiere la creación de un bucle. El uso de la función in_array no de trabajo, y también he leído que es bastante lento.

En el manual de php alguien se recomienda el uso de flip_array() y, a continuación, isset(), pero no puedo conseguir que funcione para un 2-d de la matriz.

hacer algo como

if($array['accessory']['id'] == 211)

también funcionaría para mí, pero tengo que coincidir con todas las claves que contiene accesorios — no está seguro de cómo hacer que

De todos modos, estoy girando en círculos, y podría utilizar un poco de ayuda.
Este parece que debería ser fácil. Gracias.

  • Una de las funciones de PHP, yo iba a sugerir que era, array_walk_recursive que no requieren que usted haga un bucle. Sin embargo, la función no funciona si su key tiene un valor de matriz, como el suyo. Un bucle tal vez la única manera. Puedo preguntar por qué sin bucles?
  • Forloney: estoy un poco confundido. Esta función debe hacer exactamente lo que el OP quiere. Se puede explicar mejor por qué no iba a funcionar? El único problema que veo es que el bucle a través de todos los valores, incluso si un partido ya fue encontrado.
  • Bien cuando yo estoy comprobando si el valor existe, es ya un bucle a través de todos los valores de la id (contenida en un objeto) para que coincida contra. Sólo estoy tratando de reducir el tiempo de búsqueda.
  • He encontrado esto en la web: Cualquier tecla que contiene una matriz no serán pasados a la función. Mientras que el OP de la matriz de claves que contiene una matriz. A menos que yo lo estoy interpretando mal que cita, parece que las claves que ha matriz de valores no se pasa a la función, lo que no sería una respuesta a su pregunta.
  • Forloney: Sí, pero eso no importa. Funciona de forma recursiva. La clave, que contiene la matriz no se pasa a la función, que es la verdadera. Pero las llaves en el interior de este (sub)matriz se pasan. Así funciona exactamente como usted la describe en el primer lugar. En lugar de, por ejemplo,operator, los elementos en el subarray se pasan (es decir,qty, id) y se puede comprobar en contra de ellos. Mira el ejemplo en el docs… Pero como el OP solo quiere buscar id, array_walk es de hecho más fácil.
  • Fue entonces que mi malentendido, yo sólo había pensado en todas las llaves dentro de la matriz sería saltado así. Estoy trabajando en este momento y no tenía tiempo para probar cualquier cosa por mí mismo.
  • Forloney: No es gran cosa 🙂
  • Es esta una única operación, o será necesario realizar múltiples búsquedas separadas para diferentes identificador? Si es sólo una vez, en un bucle anidado es lo que usted debe usar. De lo contrario, usted puede transformar en una estructura más adecuada para la obtención de información a través de una clave. ¿Qué se necesita?
  • Necesito realizar múltiples búsquedas separadas para diferentes ids. Es por eso que he preferido no utilizar un bucle.

InformationsquelleAutor dardub | 2010-04-22

6 Comentarios

  1. 6

    Hola dardub, puede utilizar array_walk para comprobar si un determinado valor dentro de su matriz – array_walk recorre al elementos de usted matriz y applys una función a ellos, así que, básicamente, usted necesita para crear esa función. Se utiliza de la siguiente manera:

    $arr = array(
        'one' => array('id' => 1),
        'two' => array('id' => 2),
        'three' => array('id' => 3)
    );
    
    function checkValue($value, $key)
    {
        echo $value['id'];
    }
    
    array_walk($arr, 'checkValue');

    Usted sólo tendrá que añadir a su función lo condicionales/validaciones que iba a necesitar.

    Espero que ayude.

    M.

    EDITAR:
    PHP docs en array_walk http://www.php.net/manual/en/function.array-walk.php

    • Usted debe agregar un enlace a la documentación y también mencionar que se puede pasar un tercer parámetro para array_walk que de nuevo se pasa a la función de devolución de llamada (es decir, esta es la manera de pasar el id buscar).
    • puedo tener la función devuelva un valor booleano? Estoy teniendo problemas para conseguir que con el trabajo?
    • array_walk devuelve true o false, pero dependiendo de si la devolución de llamada se ha ejecutado correctamente o no se puede utilizar un indicador (variable global) para indicar si el valor que está buscando se ha encontrado o no.
    • Gracias por la ayuda falomir y Félix. Creo que puedo conseguir este trabajo para satisfacer mis necesidades.
  2. 0
    $map = array();
    foreach ($arr as $v) {
        $map[$v['id']] = 1;
    }
    //then you can just do this as when needed
    $exists = isset($map[211]);

    O si necesita los datos asociados con ella

    $map = array();
    foreach ($arr as $k => $v) {
        $map[$v['id']][$k] = $v;
    }
    print_r($map[211]);
  3. 0
    <?php
    
    //PHP 5.3 way to do it
    
    function searchNestedArray(array $array, $search, $mode = 'value') {
    
        foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $key => $value) {
            if ($search === ${${"mode"}})
                return true;
        }
        return false;
    }
    
    $data = array(
        array('abc', 'ddd'),
        'ccc',
        'bbb',
        array('aaa', array('yyy', 'mp' => 555))
    );
    
    var_dump(searchNestedArray($data, 555));
  4. 0

    He utilizado un método estático porque lo necesitaba en una clase, pero si se desea se puede utilizar como una función simple.

    /**
     * Given an array like this
     * array(
     *   'id' => "first",
     *   'title' => "First Toolbar",
     *   'class' => "col-md-12",
     *   'items' => array(
     *       array(
     *           'tipo' => "clientLink",
     *           'id' => "clientLinkInsert"
     *       )
     *   )
     * )
     *
     * and array search like this
     * array("items", 0, "id")
     * 
     * Find the path described by the array search, in the original array
     *
     * @param array $array source array
     * @param array $search the path to the item es. ["items", 0, "tipo"]
     * @param null|mixed $defaultIfNotFound the default value if the value is not found
     *
     * @return mixed
     */
    public static function getNestedKey($array, $search, $defaultIfNotFound = null)
    {
        if( count($search) == 0 ) return $defaultIfNotFound;
        else{
            $firstElementSearch = self::array_kshift($search);
    
            if (array_key_exists($firstElementSearch, $array)) {
                if( count($search) == 0 )
                    return $array[$firstElementSearch];
                else
                    return self::getNestedKey($array[$firstElementSearch], $search, $defaultIfNotFound);
            }else{
                return $defaultIfNotFound;
            }
        }
    }
  5. 0

    Puede utilizar

    Arr::getNestedElement($array, $keys, $default = null)

    de este de la biblioteca para obtener el valor de la matriz multidimensional utilizando las teclas especificada como 'key1.key2.key3' o ['key1', 'key2', 'key3'] de reserva y el valor predeterminado si no hay ningún elemento fue encontrado. Usando tu ejemplo se verá como:

    if (Arr::getNestedElement($array, 'accessory.id') == 211)

Dejar respuesta

Please enter your comment!
Please enter your name here