2010-02-07 8 views
27

¿Realmente tengo que hacer esto para restablecer una matriz?borrar todos los valores de una matriz mientras se mantienen las claves intactas

foreach ($array as $i => $value) { 
    unset($array[$i]); 
} 

EDIT:

éste tiene más sentido, como la anterior es equivalente a $array=array();

foreach ($array as $i => $value) { 
    $array[$i]=NULL; 
} 
+1

'array_map (function() {return '';}, $ array)' – caw

+0

** ** Ver también: preguntas y respuestas para pitón http: // equivalente stackoverflow. com/questions/22991888 – dreftymac

Respuesta

12

definir esta función y lo llaman cada vez que lo necesita:

function erase_val(&$myarr) { 
    $myarr = array_map(create_function('$n', 'return null;'), $myarr); 
} 

// It's call by reference so you don't need to assign your array to a variable. 
// Just call the function upon it 
erase_val($array); 

Eso es todo!

+6

Lo siento, pero esta es de lejos la peor respuesta publicada - 'create_function()' es básicamente 'eval()' y definitivamente no debería usarse para resolver un problema tan trivial como este. Además, una función para eso también es completamente exagerada. OMI, esta no debería ser la respuesta aceptada. –

0

desarmar sería eliminar la clave, es necesario para establecer el valor a un valor nulo o 0 según su requerimiento.

Example

5

no hay ninguna función de acumulación para restablecer una matriz para simplemente es llaves.

Una alternativa sería a través de una devolución de llamada y array_map():

$array = array('a' => 'foo', 'b' => 'bar', 'c' => 'baz'); 

Con la función de devolución de llamada normal

function nullify() {} 
$array = array_map('nullify', $array); 

O con una lambda con PHP < 5,3

$array = array_map(create_function('', ''), $array); 

O con lambda a partir de PHP 5.3

$array = array_map(function() {}, $array); 

En todos los casos var_dump($array); salidas:

array(3) { 
    ["a"]=> NULL 
    ["b"]=> NULL 
    ["c"]=> NULL 
} 
+0

Sí, eso se ve bien. +1 –

+0

@stereofrog Derecha. Cambié las funciones. No es que esté mal con el cuerpo y la discusión, pero ¿por qué agregar desorden? Gracias. – Gordon

+0

esto es genial :) – markus

0

a hacer esto:

$arrayWithKeysOnly = array_keys($array); 

http://php.net/manual/en/function.array-keys.php

EDIT: Direccionamiento comentario:

Ok, a continuación, haga lo siguiente:

$arrayWithKeysProper = array_flip(array_keys($array)); 

http://www.php.net/manual/en/function.array-flip.php

EDIT: En realidad pensar en ello, que probablemente no funcionará bien.

+0

Esto devolvería una matriz con las claves siendo los valores y no es lo que quiere el OP. Quiere mantener las claves y solo purgar los valores – Gordon

+0

'array_flip' tampoco, ya que los valores de la matriz serían ascendentes, por ejemplo. 'a' => 0, 'b' => 1 y así sucesivamente – Gordon

+0

sí, yo diría que tienes que caminar. –

40
$keys = array_keys($array); 
$values = array_fill(0, count($keys), null); 
$new_array = array_combine($keys, $values); 

conseguir las llaves

Obtener un conjunto de valores nulos con el mismo número de elementos

los combinamos, utilizando claves y las claves y los valores nulos como los valores

Como comenta sugiero, esto es fácil a partir de PHP 5.2 con array_fill_keys

$new_array = array_fill_keys(array_keys($array), null); 
+6

+1, estas funciones son útiles con bastante frecuencia. A partir de PHP 5.2, incluso hay 'array_fill_keys()'. – Inshallah

+1

+1, ambas soluciones anteriores son más rápidas, array_combine es la mejor de las dos. – FMCorz

+0

Esto es exactamente lo que necesito. Gracias por compartir .. –

1

No entiendo la pregunta bastante bien, pero tu ejemplo

foreach ($array as $i => $value) { 
    unset($array[$i]); 
} 

es equivilent a

$array = array(); 
+0

Sí, es cierto, Las claves también se eliminan ... Quería una función incorporada para hacer esto: foreach ($ array as $ i => $ value) { $ array [$ i] = NULL; } – jfoucher

2
foreach($a as &$v) 
    $v = null; 

El razonamiento detrás de fijar un elemento de la matriz null es que una matriz necesita tener un valor para cada clave, de lo contrario, una clave no tiene sentido. Es por eso que se llama clave: se usa para acceder a un valor. Un valor nulo parece una elección razonable aquí.

envolverlo en un procedimiento [reutilizable]:

function array_purge_values(&$a) 
{ 
    foreach($a as &$v) 
     $v = null; 
} 

Tenga en cuenta sin embargo que la versión de PHP a partir de valores de 5,3 Pass de funciones por referencia por defecto, es decir, el signo precedente variable de argumento en la declaración de la función es redundante. No solo eso, sino que recibirá una advertencia de que la noción está obsoleta.

+0

fácil, agradable y limpio – Gordon

+1

Fácil, sí, pero no es reutilizable. Código como este apesta. Lo siento. – aefxx

+0

@aefxx Luego solo envuélvelo en una función y contamine el alcance global con el olor de otra función de usuario – Gordon

0

¿Por qué no hacer una matriz con las claves requeridas y dividirla en variable cuando desea restablecerla?

function resetMyArr(&$arr) 
{ 
$arr = array('key1'=>null,'key2'=>null); 
} 
18

gama de relleno con llaves viejas y valores nulos

$array = array_fill_keys(array_keys($array), null)

+2

No está claro por la pregunta de OP si esto es realmente lo que quiso decir o quería: es lo que yo quería, así que +1 para proporcionar la solución más simple/más corta posible. –

0

Este es un tema bastante antiguo, pero ya hice referencia a ella antes de llegar a mi propia solución para obtener un resultado más específico, entonces, por lo tanto, compartiré con ustedes esa solución.

El resultado deseado fue anular todos los valores, manteniendo las teclas, y buscar recursivamente la matriz para sub-arrays también.

recursiva SET MULTI-nivel de matriz VALORES a NULL:

function nullifyArray(&$arrayData) { 

    if (is_array($arrayData)) { 
    foreach ($arrayData as $aKey => &$aValue) { 
     if (is_array($aValue)) { 
     nullifyArray($aValue); 
     } else { 
     $aValue = null; 
     } 
    } 
    return true;  // $arrayData IS an array, and has been processed. 
    } else { 
    return false; // $arrayData is NOT an array, no action(s) were performed. 
    } 

} 

Y aquí es en su uso, junto con ANTES y DESPUÉS salida del contenido de la matriz.

código PHP para crear un multinivel-array, y llama a la función nullifyArray():

// Create a multi-level array. 
$testArray = array(
    'rootKey1'    => 'rootValue1', 
    'rootKey2'    => 'rootValue2', 
    'rootArray1'   => array(
     'subKey1'   => 'subValue1', 
     'subArray1'   => array(
      'subSubKey1' => 'subSubValue1', 
      'subSubKey2' => 'subSubValue2' 
     ) 
    ) 
); 

// Nullify the values. 
nullifyArray($testArray); 

ANTES DE LLAMADA A nullifyArray():

Array 
(
    [rootKey1] => rootValue1 
    [rootKey2] => rootValue2 
    [rootArray1] => Array 
     (
      [subKey1] => subValue1 
      [subArray1] => Array 
       (
        [subSubKey1] => subSubValue1 
        [subSubKey2] => subSubValue2 
       ) 

     ) 

) 

DESPUÉS DE LLAMADA A nullifyArray():

Array 
(
    [rootKey1] => 
    [rootKey2] => 
    [rootArray1] => Array 
     (
      [subKey1] => 
      [subArray1] => Array 
       (
        [subSubKey1] => 
        [subSubKey2] => 
       ) 

     ) 

) 

Espero que ayude a alguien/a cualquier persona, y gracias a todos los que respondieron la pregunta anteriormente.

1

Si necesita anular los valores de una matriz asociativa se puede caminar todo el conjunto y hacer una devolución de llamada para establecer valores en nulo por lo tanto sigue teniendo las llaves

array_walk($ar,function(&$item){$item = null;}); 

En caso si usted necesita para anular la totalidad matriz tal y reasignar al vacío una

$ar = array(); 
Cuestiones relacionadas