php copiando gli elementi dell'arrays per valore, non per riferimento

Ho il codice seguente:

$data['x'] = $this->x->getResults(); $data['y'] = $data['x']; //some code here to modify $data['y'] //this causes (undesirably) $data['x] to be modified as well 

Suppongo che dal momento che tutti gli elementi di $ data siano essi stessi riferimenti, la modifica di $ data ['y'] modifica anche $ data ['x'] .. che NON è quello che voglio. Voglio che $ data ['x'] rimanga uguale. C'è un modo per dereferenziare gli elementi qui in modo che io possa copiare gli elementi in base al valore?

Grazie.

Aggiornamento: $ this-> x-> getResults (); restituisce un arrays di oggetti. Quindi posso fare qualcosa del tipo: $ data ['x'] [0] -> date_create …

Aggiornamento : il mio ultimo tentativo di clonare l'arrays è simile a questo:

  $data['x'] = $this->x->getResults(); $data['y'] = $data['y']; foreach($data['x'] as $key=>$row) { $data['y'][$key]->some_attr = clone $row->some_attr; } 

Sono lontano qui? Continuo a ricevere un errore "__clone metodo chiamato su un object". Dalla lettura delle risposte sembra che la mia migliore opzione sia quella di iterare su ciascun elemento e clonarlo (che è quello che stavo cercando di fare con quel codice ..).

AGGIORNAMENTO : L'ho appena risolto !: all'interno del ciclo foreach avevo solo bisogno di cambiare linea per:

 $data['y'][$key] = clone $row; 

E funziona! Grazie a tutti per l'aiuto.

È ansible sfruttare il fatto che PHP diterrà i risultati di una chiamata di function.

Ecco un esempio di codice che ho montato:

 $x = 'x'; $y = 'y'; $arr = arrays(&$x,&$y); print_r($arr); echo "<br/>"; $arr2 = $arr; $arr2[0] = 'zzz'; print_r($arr); print_r($arr2); echo "<br/>"; $arr2 = arrays_flip(arrays_flip($arr)); $arr2[0] = '123'; print_r($arr); print_r($arr2); 

I risultati sono simili a questo:

 Array ([0] => x [1] => y)
 Array ([0] => zzz [1] => y) Array ([0] => zzz [1] => y)
 Array ([0] => zzz [1] => y) Array ([0] => 123 [1] => y) 

Si può vedere che i risultati dell'utilizzo di arrays_flip() durante l'assegnazione di $arr a $arr2 differenze nelle successive modifiche a $arr2 , in quanto le chiamate a $arr2 arrays_flip() $arr2 un dereference.

Non sembra terribilmente efficiente, ma potrebbe funzionare per te se $this->x->getResults() restituisce un arrays:

 $data['x'] = arrays_flip(arrays_flip($this->x->getResults())); $data['y'] = $data['x']; 

Vedi questo thread (senza risposta) per un altro esempio.

Se tutto nell'arrays restituito è comunque un object, allora l'unico modo per copiare un object è usare clone() , e dovresti iterare attraverso $data['x'] e clonare each elemento in $data['y'] .

Esempio:

 $data['x'] = $this->x->getResults(); $data['y'] = arrays(); foreach($data['x'] as $key => $obj) { $data['y'][$key] = clone $obj; } 

arrays_flip() non functionrà quando i valori dell'arrays non sono stringhe né interi. Ho trovato una soluzione semplice, tuttavia:

 $clonedArr = (arrays)clone(object)$arr; 

Questo funziona grazie alle properties; del clone su un object.

Non è semplice. Leggi di clone

MA! se i tuoi elementi non sono oggetti e non riflettono le variables di tipo non hai problemi.

Esempio per i tipi di riferimento:

 $v=11; $arr[]=&$v; 

Se lavori con gli oggetti, potresti dare un'occhiata al clone , per creare una copia di un object, invece di un riferimento .

Ecco un esempio molto breve:

Innanzitutto, con un arrays, funziona in base al valore:

 $data['x'] = arrays( 'a' => 'test', 'b' => 'glop', ); $data['y'] = $data['x']; $data['y'][0] = 'Hello, world!'; var_dump($data['x']); // a => test : no problem with arrayss 

Di default, con gli oggetti, funziona per riferimento:

 $data['x'] = (object)arrays( 'a' => 'test', 'b' => 'glop', ); $data['y'] = $data['x']; $data['y']->a = 'Hello, world!'; var_dump($data['x']); // a => Hello, world! : objects are by ref 

Ma se cloni l'object, lavori su una copia:
Immagino che questo sia il tuo caso?

 $data['x'] = (object)arrays( 'a' => 'test', 'b' => 'glop', ); $data['y'] = clone $data['x']; $data['y']->a = 'Hello, world!'; var_dump($data['x']); // a => test : no ref, because of cloning 

Spero che questo ti aiuti,

È ansible utilizzare questa function per copiare arrays multidimensionali contenenti oggetti.

 <?php function arraysCopy( arrays $arrays ) { $result = arrays(); foreach( $arrays as $key => $val ) { if( is_arrays( $val ) ) { $result[$key] = arraysCopy( $val ); } elseif ( is_object( $val ) ) { $result[$key] = clone $val; } else { $result[$key] = $val; } } return $result; } ?> 

Ho appena scoperto che se vuoi semplicemente una copia di una matrix di valori (senza riferimenti) da una costante, puoi semplicemente scrivere:

$ new_arrays = (arrays) (object) self :: old_arrays;

Non è una risposta esatta alla domanda dell'OP, ma mi ha aiutato e potrebbe aiutare qualcun altro.