Tengo un php objeto (libro) con 3 propiedades: name, category, description
Tengo una lista de estos book objetos en una matriz.
Quiero crear un nuevo array asociativo para estos objetos agrupados por category.

Decir que tengo 4 libros objetos en una matriz llamada $books

name    category  description
==================================
book1   cat1     this is book 1
book2   cat1     this is book 2
book3   cat2     this is book 3
book4   cat3     this is book 4

¿cómo puedo crear una matriz asociativa denominada $categories

$categories['cat1'] = array(book1, book2)
$categories['cat2'] = array(book2)
$categories['cat3'] = array(book3)

donde el libro? es el libro de objeto y no de la palabra

InformationsquelleAutor John | 2011-03-10

8 Comentarios

  1. 44

    Como este:

    foreach($books as $book)
    { 
        $categories[$book->category][] = $book;
    }
    • lo que es una solución elegante, funciona a la perfección. gracias.
    • Si has encontrado esta respuesta y no son inmediatamente consciente de lo que está haciendo … es la creación de una nueva matriz (nombre $categories) con una clave para cada valor de $book->category. Cada valor de la clave es una matriz de $book objetos que corresponden a los que $book->category. Me gustaría hacer un ASCII de la imagen si no se vería como el barro en este comentario.
    • Y si usted desea ordenar las categorías, que es extra: ksort($categories); Consulte php.net/manual/en/function.ksort.php
  2. 4

    Simplemente bucle de la matriz de objetos en una nueva matriz con la clave de la categoría:

    $newArray = array();
    foreach($array as $entity)
    {
        if(!isset($newArray[$entity->category]))
        {
             $newArray[$entity->category] = array();
        }
    
        $newArray[$entity->category][] = $entity;
    }

    Es esto lo que estaba buscando ?

    Explicación del código:

    /*
        * Create a new blank array, to store the organized data in.
    */
    $newArray = array();
    
    /*
        * Start looping your original dataset
    */
    foreach($array as $entity)
    {
    
        /*
            * If the key in the new array does not exists, set it to a blank array.
        */
        if(!isset($newArray[$entity->category]))
        {
             $newArray[$entity->category] = array();
        }
    
        /*
            * Add a new item to the array, making shore it falls into the correct category /key
        */
        $newArray[$entity->category][] = $entity;
    }
  3. 0
    $categories = array();
    
    for ($i = 0; $i < count($books); $i++){
        if (isset($categories[$books[$i]->category]) == false)
            $categories[$books[$i]->category] = array();
    
        $categories[$books[$i]->category][] = $books[$i]
    }

    saludos

  4. 0

    Intente esto:

    $categories = array();
    foreach ($books as $book){
    
      if (!array_key_exists($book->category , $categories))
         $categories[$book->category] = array();
    
      $categories[$book->category][] = $book;
    
    }
  5. 0

    Esto debería obras:

    $categories = array();
    foreach ($books as $book) {
    
        $categories[$book['category']][] = $book;
    
    }
    • A diferencia de JavaScript, no puede acceder a las propiedades del objeto con la matriz [propertyName] sintaxis.
  6. 0

    He tenido un problema similar, pero un poco más complicado con wordpress y metavalues/metakeys (donde $resultados fue un array de arrays asociativos que se recuperan de $wpdb->get_results() de la consulta.

    Esta fue mi solución adaptada a su problema:

    $categories = array();
    foreach ($results as $row) {
        $id =  $row['category'];
        $description = $row['category'];
        $name = $row['name']
        if (!isset($categories[$id])) {
            $categories[$id] = array();
        }
        $categories[$id] = array_merge($categories[$id], 'description'=>$description , 'name'=>$name);
    }

    A continuación, puede ejecutar otro bucle for para obtener cada una matriz a partir de la matriz de categorías:

    foreach ($categories as $category) {
        var_dump($category);
    }
  7. 0

    Si quieres agrupar objetos por conseguir la tecla de método específico con o sin argumentos adicionales, puede utilizar esta biblioteca método:

    Arr::groupObjects(array $objects, string $method, ...$args): array

Dejar respuesta

Please enter your comment!
Please enter your name here