2010-09-27 15 views
8

Creo que no entiendo correctamente cómo se supone que array_splice funciona. Según entiendo, el primer param es tu matriz inicial, el segundo param es el elemento para comenzar, y el tercer parámetro es la longitud o la cantidad de elementos para eliminar/reemplazar.¿Cómo puedo eliminar un solo miembro de la matriz usando array_splice en php?

lo tanto, he esta matriz (salida de print_r):

Array ( 
[0] => Array ([TypeFlag] => S [qty] => 1 [denom] => 25 [certMessage] => [totalPrice] => 25) 
[1] => Array ([TypeFlag] => C [qty] => 2 [denom] => 25 [certMessage] => [totalPrice] => 50) 
[2] => Array ([TypeFlag] => V [qty] => 2 [denom] => 25 [certMessage] => test [totalPrice] => 50)) 

Quiero eliminar por completo el segundo elemento (la matriz con índice de 1; TypeFlag = C, etc.) que no quiero reemplazarlo con cualquier cosa; solo para devolver la matriz con los dos elementos restantes. He intentado esto (donde la compra es el nombre de la matriz):

$cart = array_splice($cart, 1,1); 

Pero lo que termino con esto es cuando se hace un print_r:

Array ([0] => Array ([TypeFlag] => C [qty] => 2 [denom] => 25 [certMessage] => [totalPrice] => 50)) 

por lo que parece ser la eliminación de 0 y 2 y dejando 1 como el resto. ¿Qué estoy haciendo mal?

Respuesta

14

array_splice devuelve una matriz que consiste en la elementos extraídos.

Usted está haciendo:

$cart = array_splice($cart, 1,1); 

Así está extrayendo segundo elemento (índice 1) y están asignando el resultado a $cart, sobrescribiendo la matriz original.

Para eliminar por completo el 2. ° elemento, no asigne el valor de retorno de array_splice a $cart. Así que acaba de hacer:

array_splice($cart, 1,1); 

Esto funciona porque la matriz es pasado por referencia a la función.

Además, si desea eliminar un solo elemento de la matriz es más eficiente y más limpio para usar como unset:

unset($cart[1]); 
+1

Así que si estoy haciendo esto dentro de una función y necesita devolver la matriz menos el valor elegido, ¿tengo que asignar primero $ carro a un valor temporal (es decir, $ cartTemp = $ cart), luego haga el empalme, luego reasigne la matriz a $ carro? ¿O simplemente hago array_splice ($ carro, 1, 1), luego devuelvo $ carro? NUNCA MENTE - lo intenté y funciona si solo hago array_splice y luego devuelvo $ cart. Gracias. – EmmyS

+1

No. No es necesario asignarlo a una temperatura. Simplemente llame a la función, pasándola a la matriz y la función cambiará la matriz. – codaddict

+0

unset necesita matrices indexadas, si la matriz no tiene índices unset lo agrega por sí mismo y si quiere su colección sin índices, lo estropea todo. – CookieMonster

5

array_splice devuelve los elementos "removidas/reemplazados", que está a continuación, la asignación para sobrescribir el carrito $ correctamente empalmado

$discard = array_splice($cart, 1,1); 

o simplemente

array_splice($cart, 1,1); 
2

Simplemente use unset():

unset($cart[1]); 
3

El único problema con el uso de unset() es que no actualiza los índices.

i.e.

$arr = array('one', 'two', 'three', 'four'); 
print_r($arr); 

matriz ( [0] => uno [1] => dos [2] => tres [3] => cuatro )

unset($arr[2]); 

print_r($arr); 

matriz ( [0] => uno [1] => dos [3] => cuatro )

mientras que array_splice se re-índice de la matriz

$arr = array('one', 'two', 'three', 'four'); 
array_splice($arr,2,1); 
print_r($arr); 

matriz ( [0] => uno [1] => dos [2] => cuatro )

Cuestiones relacionadas