Foros del Web » Programando para Internet » PHP »

Entendiendo una función

Estas en el tema de Entendiendo una función en el foro de PHP en Foros del Web. Hola. Tengo un script que me funciona pero que no obstante no entiendo. Se que se trata de una condicional, pero no comprendo exactamente su ...
  #1 (permalink)  
Antiguo 05/04/2018, 11:59
 
Fecha de Ingreso: noviembre-2005
Mensajes: 843
Antigüedad: 12 años, 10 meses
Puntos: 8
Entendiendo una función

Hola.

Tengo un script que me funciona pero que no obstante no entiendo.

Se que se trata de una condicional, pero no comprendo exactamente su significado. Lo busqué para introducir un elemento "xxx" para un resultado de una consulta a base de datos, que se expresa así:

$result = $db->loadObject();

Luego queda como sigue a continuación. Si la consulta resulta afirmativa, debe insertarse "xxx" en la plantilla.

Como digo, funciona, pero yo quiero saber y entender qué significa y si todo es correcto.


Código:
foreach($result as $value){
foreach($value as $key => $data){
echo $key.': '.$data."xxx'/>";
}
echo "xxx";
}
Si a alguien le interesa, agradecería que me lo tradujeseis.

Gracias.
  #2 (permalink)  
Antiguo 05/04/2018, 18:28
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.796
Antigüedad: 9 años
Puntos: 213
Respuesta: Entendiendo una función

Saludo
¿Y donde está la condicional?

En el código que muestras, que al parecer es de JDatabase,
lo que hace loadObject() es cargar un registro que se hace
de un determinado query.

Luego, en el foreach inicial se recorre este resultado,
y en el foreach secundario se recorren tanto los keys (nombres de campo)
como los values (el valor del campo como tal) y se muestran.

Sin embargo, si es de JDatabase el asunto,
esta de más realizar el primer foreach pues
loadObject() solo trae un registro,
en cambio si usas loadObjectList() ese
si trae un array con cada registro con sus keys y values.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #3 (permalink)  
Antiguo 06/04/2018, 03:16
 
Fecha de Ingreso: noviembre-2005
Mensajes: 843
Antigüedad: 12 años, 10 meses
Puntos: 8
Respuesta: Entendiendo una función

Hola morti y gracias por responder.

Este es todo el código:

Código:
<?php
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName('user_id'))
      ->from($db->quoteName('#__members'))
      ->where($db->quoteName('user_id') . ' = '. $db->quote($user->id));
$db->setQuery($query);
$result = $db->loadObject();

foreach($result as $value){
foreach($value as $key => $data){
echo $key.': '.$data."'xxx";
}
echo "xxx";
}
?>
Se trata de revisar si el usuario que ha accedido está o no en la tabla "db_members", y si lo está insertar "xxx"

Funciona y no entiendo lo que dices pero si elimino el primer forearch, ya no lo hace y no inserta nada.

Se trata de convertir el resultado de la consulta en un elemento insertado en la plantilla ("xxx").

Hasta $result = $db->loadObject(); no tengo problema, pero la segunda parte es confusa para mi.

No entiendo esto:

foreach($value as $key => $data){
echo $key.': '.$data."'xxx";

Ni tampoco por qué se duplica "xxx".

Gracias por cualquier aclaración.
  #4 (permalink)  
Antiguo 06/04/2018, 03:43
 
Fecha de Ingreso: noviembre-2005
Mensajes: 843
Antigüedad: 12 años, 10 meses
Puntos: 8
Respuesta: Entendiendo una función

Veo que así también funciona correctamente:

Código:
foreach($result as $value){
foreach($value as $key => $data){
echo $key.': '.$data."";
}
echo "xxx";
}
?>

¿Qué significa exactamente?:

Código:
echo $key.': '.$data."";

Última edición por JUMASOL; 06/04/2018 a las 04:02
  #5 (permalink)  
Antiguo 06/04/2018, 09:06
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.372
Antigüedad: 3 años, 2 meses
Puntos: 253
Respuesta: Entendiendo una función

la triple x se repite porque esta dentro del bucle principal y aqui

foreach($value as $key => $data){
echo $key.': '.$data."'xxx";

estas leyendo el arreglo de campos secundarios devueltos por la query,te dejo un ejemplo:

Código PHP:
Ver original
  1. $array = array(
  2.     array("Casa"=>"I-17","ciudad"=>"Valencia"),
  3.     array("Casa"=>"I-18","ciudad"=>"Valencia"),
  4.     array("Casa"=>"X-18","ciudad"=>"Caracas"),
  5.     array("Casa"=>"127-45","ciudad"=>"Maracay"),
  6.     "No es un arreglo",
  7.     "este tampoco",
  8.     array("Casa"=>"40-80","ciudad"=>"Puerto Ordaz"),
  9. );
  10.  
  11. foreach($array as $value){
  12.     if(is_array($value)){
  13.         foreach($value as $key => $data){
  14.             echo "<li>".$key.': '.$data."</li>";//Aqui estas recorriendo y mostrando la clave y el valor tomando en cuenta que el valor del primero recorrido sea un arreglo
  15.         }
  16.     }
  17. }

Esto retorna una lista de esta manera:

Casa: I-17
ciudad: Valencia
Casa: I-18
ciudad: Valencia
Casa: X-18
ciudad: Caracas
Casa: 127-45
ciudad: Maracay
Casa: 40-80
ciudad: Puerto Ordaz


y así
Código PHP:
Ver original
  1. foreach($array as $value){
  2.     if(is_array($value)){
  3.         echo "<li>Casa ".$value['Casa'].': '.$value['ciudad']."</li>";
  4.     }
  5. }

la retorna de esta manera:
Casa I-17: Valencia
Casa I-18: Valencia
Casa X-18: Caracas
Casa 127-45: Maracay
Casa 40-80: Puerto Ordaz
__________________
[email protected]
HITCEL
  #6 (permalink)  
Antiguo 06/04/2018, 11:37
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.796
Antigüedad: 9 años
Puntos: 213
Respuesta: Entendiendo una función

Pues con la explicación de lujo que ya dió xfxstudios creo que
ya tienes más claro el panorama.

Ahora, dices que la idea es validar solamente
si el usuario existe o no, y si existe es cuando
se debe hacer el foreach, en otro caso solo insertar xxx

Así el asunto, lo que podrías hacer es ahora sí
agregar un condicional antes del foreach,
preguntando por el sizeof de result, y si es cero,
que inserte xxx, y en caso contrario, haga el foreach

Y cambia ligeramente el foreach,
propongo algo así aunque no lo he probado:

Código PHP:
Ver original
  1. if( is_null($result) ) //o en vez de is_null podría ser un !sizeof($result)
  2.     echo 'xxx';
  3. else
  4. {
  5.     foreach($result as $key=>$value)
  6.         echo $key.': '.$value;
  7. }


__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #7 (permalink)  
Antiguo 07/04/2018, 05:14
 
Fecha de Ingreso: noviembre-2005
Mensajes: 843
Antigüedad: 12 años, 10 meses
Puntos: 8
Respuesta: Entendiendo una función

Gracias xfxstudios, efectivamente una explicación de lujo. Entendido perfectamente.

En cuanto a la solución que indicas, mortiprogramador, te indico que me arroja un error así:

Código:
<?php
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName('user_id'))
      ->from($db->quoteName('#__members'))
      ->where($db->quoteName('user_id') . ' = '. $db->quote($user->id));
$db->setQuery($query);
$result = $db->loadObject();

if( is_!sizeof($result) ) //o en vez de is_null podría ser un !sizeof($result)
echo "xxx";
else
{
    foreach($result as $key=>$value)
        echo $key.': '.$value;
}
?>
No funciona y la solución con if( is_null($result) tampoco.

Como sí me funciona es así:

Código:
foreach($result as $value){
foreach($value as $key => $data){
echo $key.': '.$value;
}
echo "xxx";
}

Última edición por JUMASOL; 07/04/2018 a las 05:35
  #8 (permalink)  
Antiguo 07/04/2018, 13:08
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.796
Antigüedad: 9 años
Puntos: 213
Respuesta: Entendiendo una función

Hola JUMASOL,
el motivo por el que no te funciona es porque
pusiste is_!sizeof cuando debería ser !sizeof,
revisalo por si acaso.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #9 (permalink)  
Antiguo 09/04/2018, 05:07
 
Fecha de Ingreso: noviembre-2005
Mensajes: 843
Antigüedad: 12 años, 10 meses
Puntos: 8
Respuesta: Entendiendo una función

Así también da error:


Código:
if(!sizeof($result) ) 
echo "xxx";
else
{
    foreach($result as $key=>$value)
        echo $key.': '.$value;
}
?>
  #10 (permalink)  
Antiguo 09/04/2018, 17:33
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.796
Antigüedad: 9 años
Puntos: 213
Respuesta: Entendiendo una función

¿Y cuál es el error?
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #11 (permalink)  
Antiguo 10/04/2018, 03:50
 
Fecha de Ingreso: noviembre-2005
Mensajes: 843
Antigüedad: 12 años, 10 meses
Puntos: 8
Respuesta: Entendiendo una función

Un constante intentarse cargar la página que no se carga nunca con un aviso de que la página no existe.

Puede que esté interfiriendo con otra cosa, pero lo cierto es que esa condición no funciona.

Pero esto sí funciona:

foreach($result as $value){
foreach($value as $key => $data){
echo $key.': '.$value;
}
echo "xxx";
}
  #12 (permalink)  
Antiguo 10/04/2018, 21:19
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.796
Antigüedad: 9 años
Puntos: 213
Respuesta: Entendiendo una función

Pues que raro, yo lo probe aquí tanto con is_null cómo con !sizeof con un solo foreach
y en ambos casos funciona, pero como dices, algo más debe
estar causando ese comportamiento allá.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #13 (permalink)  
Antiguo 11/04/2018, 08:56
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.940
Antigüedad: 5 años, 2 meses
Puntos: 367
Respuesta: Entendiendo una función

Creo que seria conveniente que uses var_dump o print_r despues en esta parte
Código PHP:
Ver original
  1. $result = $db->loadObject();
Para que veas o publiques aquí cual es la estructura que tiene el arreglo
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #14 (permalink)  
Antiguo 14/04/2018, 06:51
 
Fecha de Ingreso: noviembre-2005
Mensajes: 843
Antigüedad: 12 años, 10 meses
Puntos: 8
Respuesta: Entendiendo una función

Hola de nuevo.

El tema lo resuelvo ahora de esta forma:

Código:
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName('user_id'))
      ->from($db->quoteName('#__members'))
      ->where($db->quoteName('user_id') . ' = '. $db->quote($user->id));
$db->setQuery($query);
$result = $db->loadObject();

foreach($result as $value){
foreach($value as $key => $data){}
echo "xxxx";
}
Que entiendo quiere decir que si hay datos que ofrecer, es decir, si el nombre de usuario se da en la tabla de "members", se muestra un dato y se inserta "xxx".

Como yo no necesito que se muestre tal dato, lo dejo vacío:

Código:
foreach($value as $key => $data){} 
Esto me funciona correctamente, pero no sé si es correcto.



La zona horaria es GMT -6. Ahora son las 19:50.