Domanda

Ho 2 array.

$result = array();
$row = array();

elementi di riga sono tutti i riferimenti ed è in continua evoluzione. Per ogni iterazione del $row voglio copiare i Valori di riga in una voce di $result e non i riferimenti.

Ho trovato un paio di soluzioni, ma tutti sembrano piuttosto terribile.

$result[] = unserialize(serialize($row));
$result[] = array_flip(array_flip($row));

Sia del lavoro di cui sopra, ma sembra come un sacco di codice inutile e brutto solo per copiare il contenuto di un array di riferimenti per valore, invece di copiare i riferimenti stessi.

C'è un modo più pulito per ottenere questo risultato? Se non quello che sarebbe il modo più efficiente sia?

Grazie.

Modifica Come suggerito di seguito qualcosa come:

function dereference($ref) {
    $dref = array();

    foreach ($ref as $key => $value) {
        $dref[$key] = $value;
    }

    return $dref;
}

$result[] = dereference($row);

funziona anche, ma sembra altrettanto brutto.

È stato utile?

Soluzione

Non sono sicuro ho completamente capito la domanda, ma si può usare la ricorsione?

function array_copy($source) {
    $arr = array();

    foreach ($source as $element) {
        if (is_array($element)) {
            $arr[] = array_copy($element);
        } else {
            $arr[] = $element;
        }
    }

    return $arr;
}

$result = array();
$row = array(
    array('a', 'b', 'c'),
    array('d', 'e', 'f')
);

$result[] = array_copy($row);

$row[0][1] = 'x';

var_dump($result);
var_dump($row);

Altri suggerimenti

Estensione della funzione di cui sopra come segue risolto un problema che ho avuto:

function array_copy($source) {
    $arr = array();

    foreach ($source as $element) {
        if (is_array($element)) {
            $arr[] = array_copy($element);
        } elseif (is_object($element)) {
            // make an object copy
            $arr[] = clone $element;
        } else {
            $arr[] = $element;
        }
    }
    return $arr;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top