J'essaie d'insérer dans un tableau à un point donné:
$hi = "test"; $var2 = "next"; $arr = array(&$hi); $arr[] = &$var2; // this works array_splice($arr, 1, 0, &$var2); // this doesn't
4 Réponses :
Vous devrez peut-être effectuer le dernier argument un tableau, sinon selon le manuel vous serez typlesté à un.
La solution est correcte, mais pour la raison de @ Travesty3. La typée n'est pas un problème - c'est le temps d'appel de temps par référence qui échoue.
Du manuel: Si le remplacement est juste un élément, il n'est pas nécessaire de mettre un tableau () autour de celui-ci, à moins que l'élément ne soit un tableau lui-même, un objet ou une null. Code>
Lorsque j'essaie un exemple comme le vôtre, je reçois un avertissement indiquant que "la transmission par courrier électronique a été obsolète." Selon Cette réponse : p>
Vous pouvez définir allow_call_time_pass_reference à true dans votre fichier php.ini. Mais c'est un hack. P> blockQuote>
La réponse rapide et sale, mais s'il vous plaît être conscient que l'appelant cette fonction avec une référence est obsolète et peut (selon votre configuration PHP) générer un avertissement:
=== arr is now array ( 0 => 'test', 1 => 'last', 2 => 'next', )
P.s. Je pense que la raison pour laquelle les œuvres de l'appelant avec Array (et $ Var2) sont dus à part en interne, l'épissure ne doit pas avoir à convertir et $ Var2 en tableau (& $ VAR2) probablement à travers l'auto-affectation, change ainsi $ VAR2 dans le processus . Vous créez explicitement un nouveau tableau de symboles (& $ Var2) qui est physiquement séparé en mémoire sans auto-affectation requise.
P.p.s. Ce type d'effet secondaire inattendu est précisément la raison pour laquelle le passage de temps d'appel a été obsolète. ;)
@Andylobel Vous devriez changer la réponse acceptée à celle-ci.
@Hamish Cette réponse explique le problème, mais je ne pense pas qu'il mentionne réellement comment le résoudre lol (correct-moi si je me trompe)
Vous n'avez pas demandé comment le résoudre, vous avez demandé: "Pourquoi essayer de l'insérer dans le tableau avec l'échec de l'épissure et l'utilisation de la première méthode ne fonctionne pas?" La réponse «la plus droite» est que vous ne devriez vraiment pas faire cela pour commencer; Comme mentionné ailleurs, le passage de temps d'appel a été obsolète. La façon dont vous avez formulé votre question ("pourquoi?" Au lieu de "Comment est-ce que je veux?"), J'ai supposé que vous vouliez savoir quel mécanisme causait le résultat que vous voyiez, qui était la base de ma réponse.
@Kingskippos Autres personnes avec le problème préférez savoir comment le résoudre, mettrez-le en haut de votre réponse et il ticez-le, et je suis en train d'utiliser les invokeargs dans la classement de réflexion pour bindarams de manière dynamique qui vous permet uniquement de transmettre des références aussi loin que je savoir quand même
@Andylobel, il a répondu à votre question de manière détaillée et concise. Certaines personnes pourraient simplement vouloir une solution de correction rapide. D'autres personnes veulent apprendre pourquoi i> l'erreur se produit (comme votre question posée), ils peuvent donc améliorer les programmeurs. Vous décidez qui est le meilleur chemin à suivre.
@AndyLOBEL: Assez juste, je mets une solution rapide et sale en haut.
@Kingskippus Pourquoi est-ce rapide et sale? Quoi d'autre êtes-vous censé faire
Je ne voulais pas dire "rapide et sale" en ce sens qu'il y a une autre façon de stocker une référence comme ça mieux. Je voulais dire que "Voici une réponse instantanée, avec plus d'explication par la suite." :)
Ici, je suis itération d'une matrice ($ valide_arr) et de stocker les références de chaque variable dans un autre tableau ($ paramètres). Vous pouvez modifier l'utilisation de l'utilisation selon vos besoins. Résultat P> array (size=3)
0 => &string 'a' (length=1)
1 => &string 'b' (length=1)
2 => &int 123