Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Como recorrer un array y eliminar valores?

Estas en el tema de Como recorrer un array y eliminar valores? en el foro de PHP en Foros del Web. Les explico, estoy haciendo un sistema de inventarios con php, sql, html, javascript, etc...., en el cual va a haber una seccion en la que ...
  #1 (permalink)  
Antiguo 19/11/2015, 21:42
 
Fecha de Ingreso: enero-2012
Mensajes: 55
Antigüedad: 12 años, 3 meses
Puntos: 1
Como recorrer un array y eliminar valores?

Les explico, estoy haciendo un sistema de inventarios con php, sql, html, javascript, etc...., en el cual va a haber una seccion en la que se hace un pedido de inventario, es decir, va a ser una pantalla en la que se van a mostrar todos los productos que hay, cuantas existencias y un recuadro en donde va a ponerse el numero de piezas que se necaesita pedir de ese prodcuto, como esto:



En cuanto al codigo para saber que numero de piezas son las que piden y el nombre del inventario, el formulario lo tengo asi...

Código PHP:
Ver original
  1. $consul="SELECT * FROM ".$prefijo."_inventario ORDER BY idinventario ASC";
  2.                 $query=$con->query($consul);
  3.                 for($x=1; $x<=$query->rowcount(); $x++){
  4.                         $array=$query->fetch(PDO::FETCH_ASSOC);
  5.                         echo"<tr>";
  6.                         echo "<td>".$array['nombreinventario']."<input type='hidden' name='contr[$x][nombreinv]' value='".$array['nombreinventario']."'></td>";
  7.                         echo "<td>".$array['piezas']."</td>";
  8.                         echo "<td><input type='text' class='form-control' name='contr[$x][npiezas]' value='0'></td>";
  9.                         echo"</tr>";
  10.                 }

Para insertarlo en la base de datos pues se envia todo como array, y lo que quiero es recorrer el array y eliminar los nombres de inventario que el numero de piezas sea igual a 0... El array sin eliminar lo que quiero, me lo manda asi:

Código:
Array ( [1] => Array ( [nombreinv] => Motor Lavadora Koblenz [npiezas] => 10 ) [2] => Array ( [nombreinv] => Empaque olla 4" [npiezas] => 5 ) [3] => Array ( [nombreinv] => REVISION ASPIRADORAS [npiezas] => 0 ) [4] => Array ( [nombreinv] => camara [npiezas] => 0 ) [5] => Array ( [nombreinv] => Motor Raul 1 [npiezas] => 0 ) [6] => Array ( [nombreinv] => SIN REPARACION [npiezas] => 0 ) )
Y al recorrer el array y eliminar las piezas que estan en cero, quiero que aparezca asi...

Código:
Array ( [1] => Array ( [nombreinv] => Motor Lavadora Koblenz [npiezas] => 10 ) [2] => Array ( [nombreinv] => Empaque olla 4" [npiezas] => 5 ) )
Pero no se muy bien como recorrer el array y haga lo que quiero, se que se puede hacer algo asi:

Código PHP:
Ver original
  1. $arraytodo=$_POST['contr'];
  2. foreach($arraytodo as $key => $val){
  3.     if($val['npiezas'] == 0 ){
  4.         unset($key);
  5.     }
  6. }

Pero no pasa nada y me sigue imprimiendo todo... Alguien me ayuda a saber como puedo hacerlo?

Última edición por zerobathory; 19/11/2015 a las 21:49
  #2 (permalink)  
Antiguo 19/11/2015, 22:42
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Como recorrer un array y eliminar valores?

Lee bien el manual de unset() porque parece que no lo has hecho:

Código PHP:
Ver original
  1. $foo = ['x' => 'y'];
  2.  
  3. // MAL (esto sería equivalente a lo que haces)
  4. $key = 'x';
  5. unset($key);
  6.  
  7. // BIEN
  8. unset($foo['x']);

Otra forma es usar array_filter() para filtrar precisamente el array dada una función propia, etc.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 20/11/2015, 00:05
Avatar de gonzaherrera77  
Fecha de Ingreso: noviembre-2015
Mensajes: 60
Antigüedad: 8 años, 5 meses
Puntos: 7
Respuesta: Como recorrer un array y eliminar valores?

Buenas aporto mi pequeño código que hice recien, no se si es optimo por que recien estoy empezando

Recuerda que tenes un array de bidimensional.

Pruebalo

Código PHP:
Ver original
  1. <?php
  2.  
  3.    //Array bidimencional
  4.    $nombreProd = Array (
  5.                         Array ('nombreinv' => 'Motor Lavadero', 'npiezas' => 15),
  6.                         Array ('nombreinv' => 'Empaque olla 4', 'npiezas' => 5 ),
  7.                         Array ('nombreinv' => 'REVISION ASPIRADORAS', 'npiezas' => 0 ),
  8.                         Array ('nombreinv' => 'camara', 'npiezas' => 0 ),
  9.                         Array ('nombreinv' => 'Motor Raul', 'npiezas' => 0 ),
  10.                         Array ('nombreinv' => 'SIN REPARACION', 'npiezas' => 0 )
  11.               );
  12. //Variable para concatenar
  13. $indiceArray = "";
  14.  
  15. for($i = 0; $i < count($nombreProd); $i++) {
  16.          if($nombreProd[$i]['npiezas'] === 0) {
  17.             //Concateno la posicion del arreglo cuyo valor de npiezas es 0
  18.             $indiceArray .= $i;
  19.          }
  20.    }
  21. //Recorro el string $indiceArray, que va a obtener la posicion del array cuyo valor de npiezas es 0.
  22. for($i = 0; $i < strlen($indiceArray); $i++) {
  23.    //Borro el array
  24.    unset($nombreProd[$indiceArray[$i]]);
  25. }
  26.  
  27. print_r($nombreProd);
  28.  
  29.  
  30. ?>

¡Saludos!
  #4 (permalink)  
Antiguo 21/11/2015, 12:05
 
Fecha de Ingreso: enero-2012
Mensajes: 55
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Como recorrer un array y eliminar valores?

Cita:
Iniciado por gonzaherrera77 Ver Mensaje
Buenas aporto mi pequeño código que hice recien, no se si es optimo por que recien estoy empezando

Recuerda que tenes un array de bidimensional.

Pruebalo

Código PHP:
Ver original
  1. <?php
  2.  
  3.    //Array bidimencional
  4.    $nombreProd = Array (
  5.                         Array ('nombreinv' => 'Motor Lavadero', 'npiezas' => 15),
  6.                         Array ('nombreinv' => 'Empaque olla 4', 'npiezas' => 5 ),
  7.                         Array ('nombreinv' => 'REVISION ASPIRADORAS', 'npiezas' => 0 ),
  8.                         Array ('nombreinv' => 'camara', 'npiezas' => 0 ),
  9.                         Array ('nombreinv' => 'Motor Raul', 'npiezas' => 0 ),
  10.                         Array ('nombreinv' => 'SIN REPARACION', 'npiezas' => 0 )
  11.               );
  12. //Variable para concatenar
  13. $indiceArray = "";
  14.  
  15. for($i = 0; $i < count($nombreProd); $i++) {
  16.          if($nombreProd[$i]['npiezas'] === 0) {
  17.             //Concateno la posicion del arreglo cuyo valor de npiezas es 0
  18.             $indiceArray .= $i;
  19.          }
  20.    }
  21. //Recorro el string $indiceArray, que va a obtener la posicion del array cuyo valor de npiezas es 0.
  22. for($i = 0; $i < strlen($indiceArray); $i++) {
  23.    //Borro el array
  24.    unset($nombreProd[$indiceArray[$i]]);
  25. }
  26.  
  27. print_r($nombreProd);
  28.  
  29.  
  30. ?>

¡Saludos!

Hola!! Te agradezco mucho tu respuesta, cuando la copio tal cual como la pones, funciona a la perfeccion, mas sin embargo, el array que hay que recorrer lo recibo por un formulario y el metodo $_POST... Entonces al cambiar:

Código PHP:
$nombreProd = Array (
                        Array (
'nombreinv' => 'Motor Lavadero''npiezas' => 0),
                        Array (
'nombreinv' => 'Empaque olla 4''npiezas' => ),
                        Array (
'nombreinv' => 'REVISION ASPIRADORAS''npiezas' => ),
                        Array (
'nombreinv' => 'camara''npiezas' => ),
                        Array (
'nombreinv' => 'Motor Raul''npiezas' => ),
                        Array (
'nombreinv' => 'SIN REPARACION''npiezas' => )
              ); 
Lo cambio por:

Código PHP:
$nombreProd $_POST['contr']; 
Deja de funcionar y me marca lo mismo que al principio, no se si hay que recibir de alguna forma especial el $_POST, inclusive le puse:

Código PHP:
$nombreProd =array( $_POST['contr']); 
Y nada
  #5 (permalink)  
Antiguo 21/11/2015, 13:32
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Como recorrer un array y eliminar valores?

Bueno, de hecho en tu código original tenías que hacer esto:
Código PHP:
Ver original
  1. // MAL
  2. unset($key);
  3.  
  4. // BIEN
  5. unset($arraytodo[$key]);

Lo digo porque analizando la solución de gonzaherrera77 veo que tiene fallas graves.

Por ejemplo, concatena todas las claves a borrar en una cadena de texto quedando "375" por ejemplo.

Y al recorrer de nuevo la lista (innecesariamente) lo hace carácter a carácter ¿que sucedería si el índice que intentamos borrar es 99?

Pues quedaría una secuencia así "37599" pero se recorrería así "3, 7, 5, 9, 9" lo cual en definitiva es un error de concepto muy grave si se usa dicho código.

Igual quedaría mejor con un sólo loop así:
Código PHP:
Ver original
  1. // MAL
  2. $indiceArray .= $i;
  3.  
  4. // BIEN
  5. unset($nombreProd[$i]);

¡Bingo!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 21/11/2015, 14:29
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Como recorrer un array y eliminar valores?

Solo tienes que recorrer al array principal y, en cada iteración, verificar si la propiedad "npiezas" de cada array contenido, tiene como valor cero. De ser así, eliminas al array hijo del array padre a partir del índice que lo identifica en este último.

Código PHP:
Ver original
  1. foreach ($padre as $indice => $hijo){
  2.     if (!$hijo['npiezas']) unset($padre[$indice]);
  3. }

Un saludo

EDITO: Recién veo que ya te dieron la solución.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 22/11/2015, 16:47
Avatar de gonzaherrera77  
Fecha de Ingreso: noviembre-2015
Mensajes: 60
Antigüedad: 8 años, 5 meses
Puntos: 7
Respuesta: Como recorrer un array y eliminar valores?

Cita:
Iniciado por pateketrueke Ver Mensaje
Bueno, de hecho en tu código original tenías que hacer esto:
Código PHP:
Ver original
  1. // MAL
  2. unset($key);
  3.  
  4. // BIEN
  5. unset($arraytodo[$key]);

Lo digo porque analizando la solución de gonzaherrera77 veo que tiene fallas graves.

Por ejemplo, concatena todas las claves a borrar en una cadena de texto quedando "375" por ejemplo.

Y al recorrer de nuevo la lista (innecesariamente) lo hace carácter a carácter ¿que sucedería si el índice que intentamos borrar es 99?

Pues quedaría una secuencia así "37599" pero se recorrería así "3, 7, 5, 9, 9" lo cual en definitiva es un error de concepto muy grave si se usa dicho código.

Igual quedaría mejor con un sólo loop así:
Código PHP:
Ver original
  1. // MAL
  2. $indiceArray .= $i;
  3.  
  4. // BIEN
  5. unset($nombreProd[$i]);

¡Bingo!
Asi es tenes razón, yo concatene la posicion de del array por que haciendo un unset($nombreProd[$i]); solo me tomaba dos posciones solo hace la 2 y 3 no se por que motivo muestro.

Código PHP:
Ver original
  1. <?php
  2.  
  3.    //Array bidimencional
  4.    $nombreProd = Array (
  5.                         Array ('nombreinv' => 'Motor Lavadero', 'npiezas' => 15),
  6.                         Array ('nombreinv' => 'Empaque olla 4', 'npiezas' => 5 ),
  7.                         Array ('nombreinv' => 'REVISION ASPIRADORAS', 'npiezas' => 0 ),
  8.                         Array ('nombreinv' => 'camara', 'npiezas' => 0 ),
  9.                         Array ('nombreinv' => 'Motor Raul', 'npiezas' => 0 ),
  10.                         Array ('nombreinv' => 'SIN REPARACION', 'npiezas' => 0 )
  11.               );
  12.  
  13. for($i = 0; $i < count($nombreProd); $i++) {
  14.          if($nombreProd[$i]['npiezas'] === 0) {
  15.  
  16.             unset($nombreProd[$i]);
  17.             echo $i.' ';
  18.          }
  19.    }
  20. echo '<br/>';
  21.  
  22. print_r($nombreProd);
  23.  
  24.  
  25. ?>

zerobathory
ahora lo encapsule en una función probalo

Código PHP:
Ver original
  1. <?php
  2.    if(count($_POST)) {
  3.  
  4.  
  5. function limpiarArray($vector) {
  6.    $i = 0;
  7.          foreach($vector as $key) {
  8.             foreach($key as $valor) {
  9.                if($valor == '0') {
  10.                    array_splice($vector, $i, 1);
  11.                    $i--;
  12.                }
  13.             }
  14.             $i++;
  15.          }
  16.             return $vector;
  17.       }
  18. //Invoco a la funcion.
  19. $c  = limpiarArray($_POST['c']);
  20.  
  21. print_r($c);
  22. }
  23. ?>
  24. <!DOCTYPE html>
  25. <html>
  26.    <head>
  27.       <meta charset="utf-8">
  28.       <title>Test</title>
  29.    </head>
  30.    <body>
  31.       <form action="limpiarArray.php" method="post">
  32.             <input type="text" name="c[0]['nombreinv']" value="Motor Lavadora Koblenz">
  33.             <input type="text" name="c[0]['npieza']" value="10"><br />
  34.             <input type="text" name="c[1]['nombreinv']" value="Empaque olla 4">
  35.             <input type="text" name="c[1]['npieza']" value="5"><br />
  36.             <input type="text" name="c[2]['nombreinv']" value="REVISION ASPIRADORAS">
  37.             <input type="text" name="c[2]['npieza']" value="0"><br />
  38.             <input type="text" name="c[3]['nombreinv']" value="camara">
  39.             <input type="text" name="c[3]['npieza']" value="0"><br />
  40.             <input type="text" name="c[4]['nombreinv']" value="SIN REPARACION">
  41.             <input type="text" name="c[4]['npieza']" value="0"><br />
  42.  
  43.             <input type="submit" value="Enviar" />
  44.          </form>
  45.    </body>
  46. </html>

Posiblemente se pueda mejorar, hasta aca llegan mis conocimiento hasta hora.

¡Saludos!

Última edición por gonzaherrera77; 22/11/2015 a las 16:57
  #8 (permalink)  
Antiguo 23/11/2015, 13:06
 
Fecha de Ingreso: enero-2012
Mensajes: 55
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Como recorrer un array y eliminar valores?

Cita:
Iniciado por pateketrueke Ver Mensaje
Bueno, de hecho en tu código original tenías que hacer esto:
Código PHP:
Ver original
  1. // MAL
  2. unset($key);
  3.  
  4. // BIEN
  5. unset($arraytodo[$key]);


[/HIGHLIGHT]

¡Bingo!
Tienes toda la razon, era muy sencillo de corregir en el codigo original que puse, lo que pasa es que la primera vez que respondiste si lo intente pero intente otra cosa, lo habia entendido mal y no funciono, entonces por eso no habia respondido, lo siento ejeje... Pero con esto que me dices, quedo a la perfeccion

Cita:
Iniciado por Alexis88 Ver Mensaje
Solo tienes que recorrer al array principal y, en cada iteración, verificar si la propiedad "npiezas" de cada array contenido, tiene como valor cero. De ser así, eliminas al array hijo del array padre a partir del índice que lo identifica en este último.

Código PHP:
Ver original
  1. foreach ($padre as $indice => $hijo){
  2.     if (!$hijo['npiezas']) unset($padre[$indice]);
  3. }

Un saludo

EDITO: Recién veo que ya te dieron la solución.
Cita:
Iniciado por gonzaherrera77 Ver Mensaje
Asi es tenes razón, yo concatene la posicion de del array por que haciendo un unset($nombreProd[$i]); solo me tomaba dos posciones solo ....

Te agradezco mucho que hayas respondido, ya quedo totalmente solucionado, muchos saludos :)

Etiquetas: formulario, html, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:00.