PHP-tableau récursif à L'objet?

Existe - t-il un moyen de convertir un array multidimensionnel en un objet stdClass en PHP?

Coulée (object) ne semble pas fonctionner de manière récursive. json_decode(json_encode($array)) produit le résultat que je cherche, mais il doit y avoir un meilleur moyen...

31
demandé sur jantimon 2011-01-25 08:55:39

13 réponses

Pour autant que je sache, il n'y a pas de solution prédéfinie pour cela, donc vous pouvez simplement lancer la vôtre:

function array_to_object($array) {
  $obj = new stdClass;
  foreach($array as $k => $v) {
     if(strlen($k)) {
        if(is_array($v)) {
           $obj->{$k} = array_to_object($v); //RECURSION
        } else {
           $obj->{$k} = $v;
        }
     }
  }
  return $obj;
} 
52
répondu Jacob Relkin 2013-05-08 16:49:50

Je sais que cette réponse arrive en retard mais je la posterai pour tous ceux qui recherchent une solution.

Au lieu de tout cela, vous pouvez utiliser la fonction json_* native de PHP. J'ai quelques fonctions pratiques que j'utilise beaucoup

/**
 * Convert an array into a stdClass()
 * 
 * @param   array   $array  The array we want to convert
 * 
 * @return  object
 */
function arrayToObject($array)
{
    // First we convert the array to a json string
    $json = json_encode($array);

    // The we convert the json string to a stdClass()
    $object = json_decode($json);

    return $object;
}


/**
 * Convert a object to an array
 * 
 * @param   object  $object The object we want to convert
 * 
 * @return  array
 */
function objectToArray($object)
{
    // First we convert the object into a json string
    $json = json_encode($object);

    // Then we convert the json string to an array
    $array = json_decode($json, true);

    return $array;
}

J'Espère que cela peut être utile

31
répondu Ole 2012-02-07 22:59:09
function toObject($array) {
    $obj = new stdClass();
    foreach ($array as $key => $val) {
        $obj->$key = is_array($val) ? toObject($val) : $val;
    }
    return $obj;
}
7
répondu Priya 2011-08-24 14:14:42
/**
 * Recursively converts associative arrays to stdClass while keeping integer keys subarrays as arrays
 * (lists of scalar values or collection of objects).
 */
function a2o( array $array ) {
    $resultObj = new \stdClass;
    $resultArr = array();
    $hasIntKeys = false;
    $hasStrKeys = false;
    foreach ( $array as $k => $v ) {
        if ( !$hasIntKeys ) {
            $hasIntKeys = is_int( $k );
        }
        if ( !$hasStrKeys ) {
            $hasStrKeys = is_string( $k );
        }
        if ( $hasIntKeys && $hasStrKeys ) {
            $e = new \Exception( 'Current level has both integer and string keys, thus it is impossible to keep array or convert to object' );
            $e->vars = array( 'level' => $array );
            throw $e;
        }
        if ( $hasStrKeys ) {
            $resultObj->{$k} = is_array( $v ) ? a2o( $v ) : $v;
        } else {
            $resultArr[$k] = is_array( $v ) ? a2o( $v ) : $v;
        }
    }
    return ($hasStrKeys) ? $resultObj : $resultArr;
} 
3
répondu Dmitriy Sintsov 2014-03-18 15:21:49

Certaines des autres solutions affichées ici ne parviennent pas à distinguer les tableaux séquentiels (ce qui serait [] dans JS) des cartes ({} dans JS.) Pour de nombreux cas d'utilisation, il est important de distinguer les tableaux PHP qui ont toutes les clés numériques séquentielles, qui doivent être laissées en tant que telles, des tableaux PHP qui n'ont pas de clés numériques, qui doivent être convertis en objets. (Mes solutions ci-dessous ne sont pas définies pour les tableaux qui ne tombent pas dans les deux catégories ci-dessus.)

La méthode json_decode(json_encode($x)) gère les deux types correctement, mais n'est pas la solution la plus rapide. Il est toujours décent cependant, totalisant 25µs par exécution sur mes exemples de données (en moyenne sur 1m de courses, moins la surcharge de la boucle.)

J'ai comparé quelques variations du convertisseur récursif et j'ai fini avec ce qui suit. Il reconstruit tous les tableaux et objets (en effectuant une copie profonde) mais semble être plus rapide que les solutions alternatives qui modifient les tableaux en place. Il horloges à 11µs par exécution sur mon échantillon données:

function array_to_object($x) {
    if (!is_array($x)) {
        return $x;
    } elseif (is_numeric(key($x))) {
        return array_map(__FUNCTION__, $x);
    } else {
        return (object) array_map(__FUNCTION__, $x);
    }
}

Voici une version sur place. Il peut être plus rapide sur certaines grandes données d'entrée où seules de petites pièces doivent être converties, mais sur mes exemples de données, il a fallu 15µs par exécution:

function array_to_object_inplace(&$x) {
    if (!is_array($x)) {
        return;
    }
    array_walk($x, __FUNCTION__);
    reset($x);
    if (!is_numeric(key($x))) {
        $x = (object) $x;
    }
}

Je n'ai pas essayé de solutions en utilisant array_walk_recursive()

2
répondu Tobia 2016-11-14 13:47:56

Vous pouvez utiliser le array_map récursivement:

public static function _arrayToObject($array) {
    return is_array($array) ? (object) array_map([__CLASS__, __METHOD__], $array) : $array;
}

Fonctionne parfaitement pour moi car il ne convertit pas par exemple les objets Carbon en une classe stdClass de base (ce que le JSON encode/decode fait)

2
répondu Arno van Oordt 2017-11-11 16:28:11

Le moyen le plus simple de convertir un tableau associatif en objet est:

Encodez-le D'abord en json, puis décodez-le.

Comme $objectArray = json_decode(json_encode($associtiveArray));

2
répondu Sunil 2018-06-29 06:38:37
public static function _arrayToObject($array) {
    $json = json_encode($array);
    $object = json_decode($json);
    return $object
}
1
répondu Visakh B Sujathan 2018-01-24 07:36:00

Voici une fonction pour effectuer une conversion de tableau en objet en profondeur qui utilise un mécanisme de conversion de type tableau en objet interne (peu profond) de PHP. Il ne crée de nouveaux objets que lorsque cela est nécessaire, minimisant ainsi la duplication des données.

function toObject($array) {
    foreach ($array as $key=>$value)
        if (is_array($value))
            $array[$key] = toObject($value);
    return (object)$array;
}

Avertissement - n'utilisez pas ce code s'il y a un risque d'avoir des références circulaires.

0
répondu rustyx 2013-01-28 14:12:30

Voici une façon fluide de le faire qui peut gérer un tableau associatif avec une grande profondeur et n'écrase pas les propriétés d'objet qui ne sont pas dans le tableau.

    <?php

    function setPropsViaArray( $a, $o )
    {
        foreach ( $a as $k => $v )
        {
            if ( is_array( $v ) )
            {
                $o->{$k} = setPropsViaArray( $v, ! empty ( $o->{$k} ) ? $o->{$k} : new stdClass() );
            }
            else
            {
                $o->{$k} = $v;
            }
        }
        return $o;
    };

    setPropsViaArray( $newArrayData, $existingObject );
0
répondu John Foley 2016-02-22 03:15:16

Le plus court que je pourrais trouver:

array_walk_recursive($obj, function (&$val) { if (is_object($val)) $val = get_object_vars($val); });
0
répondu felixfbecker 2016-09-13 19:59:02

En retard, mais je voulais juste mentionner que vous pouvez utiliser l'encodage / décodage JSON pour convertir complètement de / en tableau:

//convert object $object into array
$array = json_decode(json_encode($object), true);
//convert array $array into object
$object = json_decode(json_encode($array));

Les fonctions Json_encode et json_decode sont disponibles à partir de php 5.2

0
répondu mhh1422 2017-01-17 09:28:51

EDIT: Cette fonction est la conversion de l'objet en tableau.

À Partir de https://forrst.com/posts/PHP_Recursive_Object_to_Array_good_for_handling-0ka

protected function object_to_array($obj)
{
    $arrObj = is_object($obj) ? get_object_vars($obj) : $obj;
    foreach ($arrObj as $key => $val) {
            $val = (is_array($val) || is_object($val)) ? $this->object_to_array($val) : $val;
            $arr[$key] = $val;
    }
    return $arr;
}
0
répondu Kamil 2017-11-26 13:52:03