Agrupar datos de un array() PHP (Solucionado)

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Avatar de Usuario
greer
Forista Medio
Forista Medio
Mensajes: 334
Registrado: Mar Feb 27, 2007 8:00 am
Ubicación: PANAMA

Agrupar datos de un array() PHP (Solucionado)

Mensaje por greer » Vie Jun 22, 2012 10:41 pm

Hola compañeros

Tengo un dilema jejeje

Alquien sabe que función o clase se puede usar en php para agrupar valores de un array ???

tengo el siguiente array:

$pais = array( 'pais' => array('panama','colombia','chile','panama'));

cada pais tiene una informacion diferente y puede que el nombre del pais se repita pero la informacion es diferente.

la idea es que se agrupe por nombre del pais pero que la informacion si se vea, como lo hace GROUP BY de MySQL

************

He buscado en google y he leido cosas paresidas pero no encuentro algo que sea equivalente al GROUP BY de MySQL que es lo que precisamente necesito.

encontre una clase llamada FilterIterator que parece ser lo que busco pero aun no doy con el resultado esperado, sigo buscando y probando a ver que tal...

si alguien sabe de algun metodo directo o mejor, se lo agradeceria

Saludos.
Última edición por greer el Mar Dic 11, 2012 10:43 pm, editado 1 vez en total.
http://greermurray.com
Avatar de Usuario
mcun
Administrador
Administrador
Mensajes: 3888
Registrado: Lun Abr 19, 2010 12:30 am
Ubicación: En una de las nalgas del culo del mundo (según la Bersuit Vergarabat)
Contactar:

Re: Agrupar datos de un array() PHP

Mensaje por mcun » Vie Jun 22, 2012 10:45 pm

creo que lo que buscas es array de dos dimensiones... busca eso a ver si es por allí
Los programadores de verdad no documentan. La documentación es para los idiotas que no pueden leer un volcado de memoria.

Trusted Network and Developer | Lee el Reglamento !! |WIKI-EL | Twitter @mr_mcun
Debian + TTY | ArchLinux + awesome | openSUSE + Gnome-Shell | Linux User #508809
Avatar de Usuario
greer
Forista Medio
Forista Medio
Mensajes: 334
Registrado: Mar Feb 27, 2007 8:00 am
Ubicación: PANAMA

Re: Agrupar datos de un array() PHP

Mensaje por greer » Vie Jun 22, 2012 11:21 pm

gracias mcun por tu pronta ayuda!!!

peor mira que segui buscando y encontre algo que puede que sea lo que estoy buscando:

la funcion se llama: array_count_values();

por lo que veo en php.net esta me agrupa.... voy a intentarlo a ver, y hacer mis experimentos a ver si logro sacar el resultado esperado

cuando lo haga publico como lo hice, derrepente puede que alguien en el futuro se pregunte como hacerlo tambien...

Saludos.
http://greermurray.com
Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1807
Registrado: Dom Oct 10, 2004 7:00 am

Re: Agrupar datos de un array() PHP

Mensaje por neurus » Vie Jun 22, 2012 11:26 pm

Aparentemente, estás buscando funciones de ordenamiento de arrays. Están todas en el manual oficial, claro.

Pero, según tu descripción, me parece que el problema lo tienes en el modo en que almacenas los datos. Lo que posteaste no puede guardar datos asociativos, por lo que la información extra que, según dices, hay sobre cada país, es de imaginar que está en otro array. Y si ordenas uno, pierdes la relación ordenada con el otro. Relación que, para el algoritmo, no existe.
Avatar de Usuario
greer
Forista Medio
Forista Medio
Mensajes: 334
Registrado: Mar Feb 27, 2007 8:00 am
Ubicación: PANAMA

Re: Agrupar datos de un array() PHP

Mensaje por greer » Vie Jun 22, 2012 11:48 pm

bueno si... la verdad ese ejemplo que puse alli es solo un ejemplo... el verdadero array es asi:

Código: Seleccionar todo

	//DISTRIBUIDORES
	$consulta_8 = "SELECT
				contentJSON
			FROM
				contentItems
			WHERE
				contentKey = 'DISTRIBUIDORES'";

	$resultado_8 = mysql_query($consulta_8,$net) or die(mysql_error());
	while($BD = mysql_fetch_assoc($resultado_8)){
		$contentJSON = $BD['contentJSON'];
		$datos_8 = json_decode($contentJSON,true);
	}
foreach($datos_8 as $uno){
$pais[] = array('pais' => $uno[pais], 'distribuidores' => $uno[distribuidores], 'distribuidores_texto' => $uno[distribuidores_texto], 'distribuidores_imagen' => $uno[distribuidores_image]);
}
La idea es que solo me agrupe por el pais ('pais' => $uno[pais])...
http://greermurray.com
Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1807
Registrado: Dom Oct 10, 2004 7:00 am

Re: Agrupar datos de un array() PHP

Mensaje por neurus » Sab Jun 23, 2012 12:45 am

La organización de los datos me sigue pareciendo un caos. O a lo mejor es que estoy entendiendo muy mal esa organización.

¿Qué muestra el sistema si agregas este echo?:

Código: Seleccionar todo

echo "<PRE>";
print_r ($pais);
echo "</PRE>";
Esto es mucho más claro trabajándolo con orientación a objetos. De todos modos, la función clásica utilizada para ordenar arrays bidimensionales es esta:

Código: Seleccionar todo

function ordenar($x, $y){
	 
	          if ( $x['pais'] == $y['pais'] )
	             return 0;
	          else if ( $x['pais'] > $y['pais'] )
	             return -1;
	          else
	             return 1;
	 
	}
La utilizas enviándole el array:

Código: Seleccionar todo

usort($pais,'ordenar');
Y luego vuelves a recorrerlo con un foreach. El array debería estar en orden luego de eso. Mira también rsort, ksort, etc, según lo que estés buscando.

Y orientado a objetos (sin corregir ni probar, así que puede contener errores):
Armas la clase Países con sus métodos:

Código: Seleccionar todo

class Paises{
   public function ordgrilla($x,$y){
         if ( $x['pais'] == $y['pais'] )
	             return 0;
	          else if ( $x['pais'] > $y['pais'] )
	             return -1;
	          else
	             return 1;
         
   }

    public function grillaP($arr){
      $this->grillaP=$arr;
      usort ($this->grillaP,'self::ordgrilla');
      return '$grillaP';   
   }
}
Creas el objeto y lo envías al método.

Código: Seleccionar todo

$grillaPaises= new Paises();
$grillaPaises->grillaP($Tu_array);  
A partir de este punto, $grillaPaises está ordenado (o debería estarlo).
Avatar de Usuario
greer
Forista Medio
Forista Medio
Mensajes: 334
Registrado: Mar Feb 27, 2007 8:00 am
Ubicación: PANAMA

Re: Agrupar datos de un array() PHP

Mensaje por greer » Mar Dic 11, 2012 10:47 pm

el resultado de mi array original tira el resultado de está forma:

Código: Seleccionar todo

Array(
	[0] => Array ( [pais] => panama [texto] => panama1 )
	[1] => Array ( [pais] => chile [texto] => chile )
	[2] => Array ( [pais] => colombia [texto] => colombia )
	[3] => Array ( [pais] => panama [texto] => panama2 )
)
y lo ideal seria que tirara el resultado asi:

Código: Seleccionar todo

Array (
	[0] => Array ( [pais] => panama [texto] => panama1, panama2 )
	[1] => Array ( [pais] => chile [texto] => chile )
	[2] => Array ( [pais] => colombia [texto] => colombia )
)
En vez de buscar alguna función o clase que haga eso, estoy tratando de hacer algo manualmente...:

Código: Seleccionar todo

$ar1[] = array('pais' => 'panama', 'texto' => 'panama1');
$ar1[] = array('pais' => 'chile', 'texto' => 'chile');  
$ar1[] = array('pais' => 'colombia', 'texto' => 'colombia'); 
$ar1[] = array('pais' => 'panama', 'texto' => 'panama2'); 

$groupedArray = array();
$paisArray = array();
foreach($ar1 as $key => $valuesAry){

	//consigo el pais actual.
	$pais = $valuesAry[pais];

	//verifico si el pais existe en mi array donde alojo los paises
	if(!in_array($pais, $paisArray)){
		//si no existe, lo agrego
		$paisArray[] = $pais;
	}

	//busco el pais actual
	$paisIndex = array_search($pais, $paisArray);

	//agrego el registro dentro del array con sus valores dentro el pais index
	$groupedArray[$paisIndex][] = $valuesAry;
}

	print_r($groupedArray);
el resultado de esto es:

Código: Seleccionar todo

Array (
	[0] => Array (
			[0] => Array ( [pais] => panama [texto] => panama1 )
			[1] => Array ( [pais] => panama [texto] => panama2 )
	)
	[1] => Array ([0] => Array ( [pais] => chile [texto] => chile ))
	[2] => Array ([0] => Array ( [pais] => colombia [texto] => colombia ))
)
estoy cerca de lograrlo pero como mencione antes, lo ideal seria que fuera asi:

Código: Seleccionar todo

Array (
	[0] => Array ( [pais] => panama [texto] => panama1, panama2 )
	[1] => Array ( [pais] => chile [texto] => chile )
	[2] => Array ( [pais] => colombia [texto] => colombia )
)
jejeje sigo dandole duro, se que se puede! jajaja

saludos.

Editado -- Mié Dic 12, 2012 6:42 am --

Hola que tal...

Se que este tema es un poco viejo pero queria publicar la solucion a mi problema para que sea guardado y que otra persona que busque algo igual pueda resolver el suyo...

Código: Seleccionar todo

$consulta = "SELECT
			d.nombre AS directorio,
			a.nombre as archivo
		FROM
			frdla_descargas_directorios AS d
				LEFT OUTER JOIN frdla_descargas_archivos AS a
				ON a.id_directorios = d.id";
$resultado = mysql_query($consulta,$net) or die(mysql_error());
while($BD = mysql_fetch_assoc($resultado)){
	$datos[] = array('directorio' => $BD['directorio'], 'archivo' => $BD['archivo']);
}

$grupo = array();
$directorios = array();
foreach($datos as $valor => $valor_){

	//CONSEGUIR EL VALOR ACTUAL
	$directorio_ = ucwords(strtolower($valor_['directorio']));

	//VERIFICAR SI EL VALOR SE REPITE
	if(!in_array($directorio_, $directorios)){
		//SI NO EXISTE LO AGREGA AL NUEVO ARRAY
		$directorios[] = $directorio_;
	}

	//JALO EL VALOR ACTUAL
	$directorio_u = array_search($directorio_, $directorios);

	//AGREGO EL NUEVO REGISTRO AL CONTENEDOR DEL VALOR CORRESPONDIENTE
	$grupo[$directorio_u][] = $valor_;
}
$directorio_ = array();
foreach($grupo as $uno){
	foreach($uno as $dos){
		$archivo_[] = $dos['archivo'];
	}
	$directorio_[] = array_filter(array(
						'directorio' => $uno[0]['directorio'],
						'archivo' => array_filter($archivo_)
					)
				);
	unset($archivo_);
}
y lo muestro asi:

Código: Seleccionar todo

<ul class="easyui-tree" data-options="animate:true,dnd:true">
	<?php foreach($directorio_ as $archivos){ ?>
	<li data-options="state:'closed'">
		<span><?php echo $archivos['directorio']; ?></span>
		<?php if($archivos['archivo']){ ?>
		<ul>
			<?php foreach($archivos['archivo'] as $archivos_){ ?>
				<li><?php echo $archivos_; ?></li>
			<?php } ?>
		</ul>
		<?php } ?>
	</li>
	<?php } ?>
</ul>
Saludos y gracias!
http://greermurray.com
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje