Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: codX en 19 Septiembre 2019, 01:11 am



Título: [Resuelto] Array en php
Publicado por: codX en 19 Septiembre 2019, 01:11 am
Hola gente del foro. Estamos trabajando con php en la facu. Me dieron el siguiente ejercicio que la verdad no entiendo. Alguien me da una mano? Gracias.

19. Mostrar todos los elementos del siguiente arreglo por medio de la estructura for
array("valor1", 1234, array("cero", "uno", "dos", "tres"))


Título: Re: Array en php
Publicado por: EdePC en 19 Septiembre 2019, 01:58 am
Saludos,

- Que parte no entiendes?

- Puedes ir revisando:

https://www.php.net/manual/es/function.array.php
https://www.php.net/manual/es/function.count.php
https://www.php.net/manual/es/control-structures.for.php


Título: Re: Array en php
Publicado por: codX en 19 Septiembre 2019, 02:09 am
para mi el array está mal definido

array("valor1", 1234, array("cero", "uno", "dos", "tres"))

como puede ser?


Título: Re: Array en php
Publicado por: EdePC en 19 Septiembre 2019, 03:00 am
- Nop, un Array puede contener elementos de cualquier tipo, incluyendo otro Array: https://www.php.net/manual/es/language.types.array.php (aunque la mayoría de los ejemplos están hechos con Arrays asociativos)

- Solo tienes que recorrer el Array con las instrucciones que te permite el ejercicio, por ejemplo para iterar: foreach o for, para contar la cantidad de elementos del array: count(), para detectar si es un array o no: cout() o is_array(), etc.


Título: Re: Array en php
Publicado por: codX en 19 Septiembre 2019, 03:14 am
Gracias  EdePC , vos como recorrerías ese array, mirá es la segunda clase de php, me parece que es mucho no se. Programo en C hace rato, pero eso nunca lo hice al menos en ese lenguaje. Por lo que entiendo no es una matriz, es como si fuesen arrays anidados? Gracias por el manual!!


Título: Re: Array en php
Publicado por: engel lex en 19 Septiembre 2019, 03:32 am
lo que entiendo no es una matriz, es como si fuesen arrays anidados?

literalmente eso es una matriz (hablando en informatica mas que en matemática) es un elemento de tipo vector que contiene elementos de tipo vector...


Título: Re: Array en php
Publicado por: EdePC en 19 Septiembre 2019, 03:40 am
- Como dije, dependerá del juego de instrucciones que te permita o exija utilizar el ejercicio, suponiendo que te exige utilizar for, count e if:

Código
  1. <?php
  2.  $array = array("valor1", 1234, array("cero", "uno", "dos", "tres"));
  3.  
  4.  for ( $i = 0; $i < count($array); $i++ ) {
  5.    if ( count($array[$i]) === 1 ) {
  6.      echo "\$array[$i] => $array[$i] <br>";
  7.    } else {
  8.      for ( $j = 0; $j < count($array[$i]); $j++ ) {
  9.        echo "\$array[$i][$j] => {$array[$i][$j]} <br>";
  10.      }
  11.    }
  12.  }

Citar
$array[0] => valor1
$array[1] => 1234
$array[2][0] => cero
$array[2][1] => uno
$array[2][2] => dos
$array[2][3] => tres

- Lo recomendable es siempre leerse un tutorial o curso o vídeos de introducción para mas o menos ver las capacidades del lenguaje y al menos tener en mente que juego de instrucciones utilizar para resolver un problema, yo recomendaría esta guía rápida de 218 págs. en español:
https://openlibra.com/es/book/programador-php-tomo-1

-- Luego siempre tener a mano la referencia completa del lenguaje, ya sea OnLine: https://www.php.net/manual/es/ u OffLine: https://www.php.net/distributions/manual/php_enhanced_es.chm


Título: Re: Array en php
Publicado por: codX en 19 Septiembre 2019, 03:56 am
mmm EdePC vengo de C, en mi muno una matriz es tan diferente!! Igual el enunciado decía utilizar for.Muchas gracias. Lo voy a mirar una rato largo. Gracias por tu tiempo. Un abrazo!


Título: Re: Array en php
Publicado por: #!drvy en 19 Septiembre 2019, 11:18 am
Ojo con el código de @EdePC ya que hay un par de cosas que no se aconsejan o directamente están mal en PHP 7.2+.

Lo que esta mal (en versiones de PHP 7.2+) es que se está utilizado count sobre objetos que pueden no ser contables. A partir de 7.2, count lanzará un Warning si el parámetro no implementa Countable.  Además count puede ser muy confuso pues count('abc') además de lanzar un warning, devuelve true en forma de integro (1). Por tanto, ese código tiene un comportamiento indeseado. Por ejemplo, si $array resulta ser un string:

Código
  1. $array = 'tarta';

Código:
t => t
count(): Parameter must be an array or an object that implements Countable on line 4

https://www.php.net/manual/es/migration72.incompatible.php




El segundo problema es un más bien una practica desaconsejada. Meter count en el propio for como comparador, implica que cada vez que haga un ciclo, la función se volverá a ejecutar y por lo tanto, volverá a calcular el tamaño del array con el procesamiento que ello conlleva. Consideramos esto por ejemplo:

Código
  1. function _count($item) {
  2.  echo ' conteo ';
  3.  return count($item);
  4. }
  5.  
  6.  
  7. $array = array("valor1", "valor2", "valor3", "valor4");
  8.  
  9. for ($i = 0; $i < _count($array); $i++) {
  10.  echo $array[$i];
  11. }


Resultado:
Código:
conteo valor1 conteo valor2 conteo valor3 conteo valor4 conteo


Si el array no varia durante el proceso o no hace falta volver a calcular su tamaño en cada ciclo, es mejor hacer el conteo previamente.

Código
  1. for ($i = 0, $max = _count($array); $i < $max; $i++) {
  2.  echo $array[$i];
  3. }

Código:
conteo valor1valor2valor3valor4




Lo que te dan en problema que se te presenta, se llama array multidimensional mixto. PHP no es fuertemente tipado por lo tanto una matriz (array) puede contener cualquier cosa dentro de ella incluidas otras matrices (multidimensional) y valores de diferentes tipos (mixto).

https://www.w3schools.com/php/php_arrays_multi.asp
https://www.guru99.com/arrays.html

Si es obligatorio que uses for (tal y como sugiere el ejercicio) puedes hacerlo como ha mostrado @EdePC.

Código
  1. for ($i = 0, $max_i = count($array); $i < $max_i; $i++) {
  2.  
  3.  if (!is_array($array[$i])) {
  4.      echo $array[$i];
  5.      continue; // salto al siguiente ciclo
  6.  }
  7.  
  8.  for ($j = 0, $max_j = count($array[$i]); $j < $max_j; $j++) {
  9.      echo $array[$i][$j];
  10.  }
  11. }


Esto será válido solo para un array de 2 dimensiones. Puedes crear una función y hacerla recursiva para recorrer arrays de multiples dimensiones:

Código
  1. function recorrer($array)
  2. {
  3.    for ($i = 0, $max = count($array); $i < $max; $i++) {
  4.        if (is_array($array[$i])) {
  5.            recorrer($array[$i]);
  6.            continue;
  7.        }
  8.  
  9.        echo $array[$i];
  10.    }
  11. }
  12.  
  13.  
  14. $array = array("valor1", 1234, array("cero", "uno", "dos", "tres"));
  15. recorrer($array);
  16. //valor11234cerounodostres


Cabe destacar que PHP ya implementa funciones muy útiles para iterar arrays. Por ejemplo, en tu caso array_walk_recursive te viene al pelo.

Código
  1. function echo_value($value, $key) {
  2.    echo $value;
  3. }
  4.  
  5. $array = array("valor1", 1234, array("cero", "uno", "dos", "tres"));
  6. array_walk_recursive($array, 'echo_value');
  7. //valor11234cerounodostres

o de forma más compacta con funciones anónimas:

Código
  1. $array = array("valor1", 1234, array("cero", "uno", "dos", "tres"));
  2.  
  3. array_walk_recursive($array, function($value, $key) {
  4.    echo $value;
  5. });
  6. //valor11234cerounodostres

https://www.php.net/manual/es/function.array-walk-recursive.php
https://www.php.net/manual/es/functions.anonymous.php


Saludos