Rebase de claves de matriz después de desarmar elementos

183

Tengo una matriz:

$array = array(1,2,3,4,5);

Si volcara el contenido de la matriz, se vería así:

array(5) {
  [0] => int(1)
  [1] => int(2)
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}

Cuando recorro y desarmo ciertas teclas, el índice se levanta todo.

foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    unset($array[$i]);
  }
}

Posteriormente, si hiciera otro volcado ahora se vería así:

array(3) {
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}

¿Hay una manera adecuada de restablecer la matriz para que sus elementos estén basados ​​en cero nuevamente?

array(3) {
  [0] => int(3)
  [1] => int(4)
  [2] => int(5)
}
TuK
fuente

Respuestas:

411

Prueba esto:

$array = array_values($array);

Usando array_values ​​()

Naftali aka Neal
fuente
66
+1. Observo que el manual no establece explícitamente que se mantendrán los pedidos, pero no puedo ver por qué no sería así.
Carreras de ligereza en órbita
16
Sí, el pedido definitivamente se mantiene. ¡Sería una función horrible si lo reordenara! :)
webbiedave
1
@webbiedave lo siento, pero eso no es cierto. Realmente reordena mi matriz. Muy muy extraño.
FooBar
44
siempre busque las soluciones concisas fáciles :)
Bruce Lim
1
Si bien esta es una solución fácil cuando la matriz ya está numerada, no funciona cuando la clave se configura como texto, como si fuera parte de un formulario HTML. Si confía en valores clave únicos para identificar la salida de un formulario, uno de los métodos a continuación funciona mejor.
17

Tengo otro método interesante:

$array = array('a', 'b', 'c', 'd'); 
unset($array[2]); 

$array = array_merge($array); 

Ahora las teclas $ array se restablecen.

Desarrollador web
fuente
13

Use en array_splicelugar de unset:

$array = array(1,2,3,4,5);
foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    array_splice($array, $i, 1);
  }
}

print_r($array);

Muestra de trabajo aquí .

Demian Brecht
fuente
77
Esto no está funcionando. el empalme sería increíble, pero no puede usarlo dentro de un bucle for / foreach porque reorganiza el índice cada vez que lo llama, por lo que el índice del bucle foreach no apunta al siguiente elemento sino al elemento con esa posición en la matriz reorganizada. Puede ver en su ejemplo que está eliminando el valor '3' y dejando el valor '2' cuando debería eliminar solo los valores '1' y '2'
NotGaeL
1
@elcodedocle Entonces no use un foreachbucle. Use el estándar i Loopy simplemente reinicie i después de un empalme. Además, Working sample here.no está funcionando.
SpYk3HH
Enlace roto, ¿podrías arreglarlo?
Michel Ayres
5

Solo un aditivo.

Sé que esto es viejo , pero quería agregar una solución que no veo que se me ocurrió. Encontré esta pregunta mientras buscaba una solución diferente y simplemente pensé: "Bueno, mientras estoy aquí".

En primer lugar, la respuesta de Neal es buena y excelente de usar después de ejecutar su ciclo, sin embargo, preferiría hacer todo el trabajo a la vez. Por supuesto, en mi caso específico tuve que hacer más trabajo que este simple ejemplo aquí, pero el método aún se aplica. Vi dónde otros dos sugirieron foreachbucles, sin embargo, esto todavía te deja después del trabajo debido a la naturaleza de la bestia. Normalmente sugiero cosas más simples como foreach, sin embargo, en este caso, es mejor recordar una buena for looplógica pasada de moda . Simplemente use i! Para mantener el índice apropiado, solo resta de icada eliminación de un elemento de matriz.

Aquí está mi ejemplo simple y funcional :

$array = array(1,2,3,4,5);

for ($i = 0; $i < count($array); $i++) {
    if($array[$i] == 1 || $array[$i] == 2) {
        array_splice($array, $i, 1);
        $i--;
    }
}

Saldrá:

array(3) {
    [0]=> int(3)
    [1]=> int(4)
    [2]=> int(5)
}

Esto puede tener muchas implementaciones simples. Por ejemplo, mi caso exacto requería mantener el último elemento en una matriz basado en valores multidimensionales. Te mostraré lo que quiero decir:

$files = array(
    array(
        'name' => 'example.zip',
        'size' => '100000000',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '10726556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '110726556',
        'type' => 'application/x-zip-compressed',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example2.zip',
        'size' => '12356556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example2.zip',
        'deleteUrl' => 'server/php/?file=example2.zip',
        'deleteType' => 'DELETE'
    )
);

for ($i = 0; $i < count($files); $i++) {
    if ($i > 0) {
        if (is_array($files[$i-1])) {
            if (!key_exists('name', array_diff($files[$i], $files[$i-1]))) {
                if (!key_exists('url', $files[$i]) && key_exists('url', $files[$i-1])) $files[$i]['url'] = $files[$i-1]['url'];
                $i--;
                array_splice($files, $i, 1);
            }
        }
    }
}

Saldrá:

array(1) {
    [0]=> array(6) {
            ["name"]=> string(11) "example.zip"
            ["size"]=> string(9) "110726556"
            ["type"]=> string(28) "application/x-zip-compressed"
            ["deleteUrl"]=> string(28) "server/php/?file=example.zip"
            ["deleteType"]=> string(6) "DELETE"
            ["url"]=> string(44) "28188b90db990f5c5f75eb960a643b96/example.zip"
        }
    [1]=> array(6) {
            ["name"]=> string(11) "example2.zip"
            ["size"]=> string(9) "12356556"
            ["type"]=> string(28) "application/x-zip-compressed"
            ["deleteUrl"]=> string(28) "server/php/?file=example2.zip"
            ["deleteType"]=> string(6) "DELETE"
            ["url"]=> string(45) "28188b90db990f5c5f75eb960a643b96/example2.zip"
        }
}

Como puede ver, manipulo $ i antes del empalme ya que estoy buscando eliminar el elemento anterior, en lugar del presente.

SpYk3HH
fuente
1

Respuesta tardía pero, después de PHP 5.3 podría ser así;

$array = array(1, 2, 3, 4, 5);
$array = array_values(array_filter($array, function($v) {
    return !($v == 1 || $v == 2);
}));
print_r($array);
K-Gun
fuente
1

O puede hacer su propia función que pase la matriz por referencia.

function array_unset($unsets, &$array) {
  foreach ($array as $key => $value) {
    foreach ($unsets as $unset) {
      if ($value == $unset) {
        unset($array[$key]);
        break;
      }
    }
  }
  $array = array_values($array);
}

Entonces, todo lo que tienes que hacer es ...

$unsets = array(1,2);
array_unset($unsets, $array);

... y ahora $arrayestá sin los valores que colocó $unsetsy las teclas se restablecen

alegre
fuente
1

100% trabajando para mi! Después de desarmar elementos en la matriz, puede usar esto para volver a indexar la matriz

$result=array_combine(range(1, count($your_array)), array_values($your_array));
Atta Ur Rehman
fuente
0

Yo uso $arr = array_merge($arr); para rebase una matriz. Simple y directo.

Rockin4Life33
fuente
-2

En mi situación, necesitaba retener claves únicas con los valores de la matriz, así que solo usé una segunda matriz:

$arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot");
unset($arr1);

$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);
John K
fuente
1) Usted, unset($arr1)lo que hará que NO esté disponible para iterar en su bucle. 2) Te falta el punto y coma en la penúltima línea. Este fragmento de código no se ejecutará.
Rockin4Life33