es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Array de objetos: asignar claves según el valor del campo del objeto

Tengo un array asociativo de objetos. Quiero establecer las claves en ese array por el valor del campo del objeto. Todas las preguntas que vi se trataban de agrupación, pero en mi caso estos valores siempre son únicos.

Lo que tengo:

<?php

$demo = [
    (object) ['key' => 'a', 'xxx' => 'xxx'],
    (object) ['key' => 'b', 'xxx' => 'xxx'],
    (object) ['key' => 'c', 'xxx' => 'xxx']
];

$result = [];
foreach ($demo as $item) {
    $result[$item->key] = $item;
}

die(print_r($result));

Resultado:

Array
(
    [a] => stdClass Object
        (
            [key] => a
            [xxx] => xxx
        )

    [b] => stdClass Object
        (
            [key] => b
            [xxx] => xxx
        )

    [c] => stdClass Object
        (
            [key] => c
            [xxx] => xxx
        )
)

Pero ¿hay alguna manera mejor, sin bucle? ¿Cuál sería la solución más corta, en una sola línea?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como mencionaste que los valores en el campo “key” siempre son únicos, hay una solución más corta disponible utilizando array_reduce en lugar de un bucle foreach:

    $result = array_reduce($demo, function($carry, $item) {
        $carry[$item->key] = $item;
        return $carry;
    }, []);
    
    die(print_r($result));
    

    En esta solución, array_reduce se utiliza para iterar sobre el arreglo $demo, y para cada elemento, se establece la clave en el arreglo $carry utilizando el valor del campo “key” del objeto como nombre de clave. El arreglo $carry luego se devuelve y se utiliza como el valor $carry en la próxima iteración. El valor inicial para $carry es un arreglo vacío.

    Esto logra el mismo resultado que el bucle foreach, pero con un bloque de código más corto.

Comments are closed.