[Resuelto] Array en php

Iniciado por codX, 19 Septiembre 2019, 01:11 AM

0 Miembros y 1 Visitante están viendo este tema.

codX

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"))


codX

para mi el array está mal definido

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

como puede ser?

EdePC

- 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.

codX

#4
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!!

engel lex

Cita de: decoder_2019 en 19 Septiembre 2019, 03:14 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...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

EdePC

- 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 (php) [Seleccionar]
<?php
  $array 
= array("valor1"1234, array("cero""uno""dos""tres"));

  for ( 
$i 0$i count($array); $i++ ) {
    if ( 
count($array[$i]) === ) {
      echo 
"\$array[$i] => $array[$i] <br>";
    } else {
      for ( 
$j 0$j count($array[$i]); $j++ ) {
        echo 
"\$array[$i][$j] => {$array[$i][$j]} <br>";
      }
    }
  }


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

codX

#7
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!

#!drvy

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 (php) [Seleccionar]
$array = 'tarta';


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 (php) [Seleccionar]
function _count($item) {
  echo ' conteo ';
  return count($item);
}


$array = array("valor1", "valor2", "valor3", "valor4");

for ($i = 0; $i < _count($array); $i++) {
  echo $array[$i];
}



Resultado:
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 (php) [Seleccionar]
for ($i = 0, $max = _count($array); $i < $max; $i++) {
  echo $array[$i];
}


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 (php) [Seleccionar]
for ($i = 0, $max_i = count($array); $i < $max_i; $i++) {
 
  if (!is_array($array[$i])) {
      echo $array[$i];
      continue; // salto al siguiente ciclo
  }
       
  for ($j = 0, $max_j = count($array[$i]); $j < $max_j; $j++) {
      echo $array[$i][$j];
  }
}



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 (php) [Seleccionar]
function recorrer($array)
{
    for ($i = 0, $max = count($array); $i < $max; $i++) {
        if (is_array($array[$i])) {
            recorrer($array[$i]);
            continue;
        }

        echo $array[$i];
    }
}


$array = array("valor1", 1234, array("cero", "uno", "dos", "tres"));
recorrer($array);
//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 (php) [Seleccionar]
function echo_value($value, $key) {
    echo $value;
}

$array = array("valor1", 1234, array("cero", "uno", "dos", "tres"));
array_walk_recursive($array, 'echo_value');
//valor11234cerounodostres


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

Código (php) [Seleccionar]
$array = array("valor1", 1234, array("cero", "uno", "dos", "tres"));

array_walk_recursive($array, function($value, $key) {
    echo $value;
});
//valor11234cerounodostres


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


Saludos