8
votes

Fusion récursive PHP

J'ai besoin de fusionner des tableaux de manière différente et j'utilise array_merge_recursive. Cependant, il y a quelque chose que j'ai besoin de changer et je ne sais pas comment. Voici la citation de php.net

Si, toutefois, les tableaux ont la même clé numérique, la valeur ultérieure ne remplacera pas la valeur d'origine, mais sera annexé. p> BlockQuote>

Je veux cette valeur, à ne pas être ajoutée, je veux ne pas appendre les valeurs exactes dans le nouveau tableau.Hope que vous avez comprise cela. P>

Exemple: P> xxx pré>

si j'utilise array_merge_recursive, il en résultera: P>

$array = array(
   'some'  => array(
       'other'    => 'key',
   ),
);

$array2 = array();
$array2['some']['other2'] = 'key2';

print_r(array_merge($array, $array2));


6 commentaires

Quelle est la profondeur de la nidification de votre tableau? Juste un niveau?


Alors dites-nous quel devrait être votre résultat?


Eh bien, il peut être illimité. Je ne l'utiliserai que pour 1 niveau.


@Scube Le résultat devrait être (si vous utilisez Array_Merge) ne doit pas supprimer les éléments précédents du premier tableau. Le deuxième exemple montre: tableau ([Quelqu'un] => tableau ([autre2] => key2)) et je veux montrer: tableau ([Quelqu'un] => tableau ([Autre] => Key [Autre2] => Key2) )


@ALEX: Que pensez-vous d'exécuter que: $ array = tableau ('Certains' => Array ('Autre' => 'Key',),); $ Array2 ['Certains'] ['Autre'] = 'Key2'; Lorsque vous utilisez Array_Merge_Recursive?


Eh bien, je voulais expliquer que récursif ne convient pas ce dont j'ai besoin. Le titre vous a confise.


5 Réponses :


5
votes

Essayez ceci xxx


1 commentaires

Cette réponse peut ne pas être correcte probablement. Parce que j'ai testé votre réponse et les résultats ne sont pas comme ce que j'attendais. Pouvez-vous s'il vous plaît jeter un oeil à ce lien? Lien



1
votes

J'ai écrit ma classe de fusion pour cela:

<?php

class ArrayMerge
{

    /**
     * @param array $a
     * @param array $b
     *
     * @return array
     */
    public function merge ( $a, $b ) {
        foreach ( $b as $k => $v ) {
            if ( is_array( $v ) ) {
                if ( isset( $a[ $k ] ) ) {
                    if ( $this->isDeep( $v ) ) {
                        $a[ $k ] = $this->merge( $a[ $k ], $v );
                    } else {
                        $a[ $k ] = array_merge( $a[ $k ], $v );
                    }
                } else {
                    $a[ $k ] = $v;
                }
            } else {
                $a[ $k ] = $v;
            }
        }
        return $a;
    }

    /**
     * @param array $array
     *
     * @return bool
     */
    private function isDeep ( $array ) {
        foreach ( $array as $elm ) {
            if ( is_array( $elm ) ) {
                return TRUE;
            }
        }
        return FALSE;
    }

}


0 commentaires

1
votes

J'ai commencé à partir de la version de Riad et j'ai ajouté la manipulation des objets. Besoin de test et de rétroaction xxx


0 commentaires

2
votes

Une autre alternative, le array_merge_deep de Drupal: xxx


0 commentaires

7
votes

pour php> = 5.3 Il suffit d'utiliser Array_replace_recursive


0 commentaires