Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] array_intersect() no funciona en un if

Estas en el tema de array_intersect() no funciona en un if en el foro de PHP en Foros del Web. Código PHP: <?php print_r ( array_intersect ( array_keys ( $value ),[ 'id_socio' , 'nombre' , 'apellidos' ]))  ?> <?php  if( array_intersect ( array_keys ( $value ),[ ...
  #1 (permalink)  
Antiguo 29/10/2018, 15:49
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
array_intersect() no funciona en un if

Código PHP:
<?php print_r(array_intersect(array_keys($value),['id_socio','nombre','apellidos'])) ?>
<?php 
if(array_intersect(array_keys($value),['id_socio','nombre','apellidos','edad'])): ?>
la función print_r(array_intersect(array_keys())) me devuelve lo esperado

el if if(array_intersect(array_keys()) me devuelve todo a no ser que lo cambie por un false if(false) donde no devolveria nada, pero el filtrado no se aplica

estoy usando la ultima versión de XAMPP
  #2 (permalink)  
Antiguo 29/10/2018, 17:33
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: array_intersect() no funciona en un if

Siempre lo he dicho uno de los errores mas comunies entre desarrolladores es no documentar bien un problema, este es el segundo caso este día.

Suerte amigo!
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 29/10/2018, 17:52
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: array_intersect() no funciona en un if

Hola hhs, gracias por responder, aunque me has dejado desconcertado, espero hacerlo mejor ahora

Veamos, la consulta SQL devuelve varias filas, la idea es comparando cada fila con un array adicional como filtro, de tal manera que solo se muestren los campos necesarios, lo raro es que no funcione en el IF, porque el print_r lo hace correctamente

Código PHP:
        <?php foreach (mysqli_query($cnx,$query) as $value): ?>

            <?php print_r(array_intersect(array_keys($value),['id_socio','nombre','apellidos'])) ?>




            <?php if (array_intersect(array_keys($value),['id_socio','nombre','apellidos','edad'])): ?>
                <tr>
                    <?php foreach ($value as $key => $value): ?>
                        <td>
                            <?php if ($key=='edad'): ?>
                                <?=date_diff(date_create($value),date_create(date('Y-m-d')))->format('%y')?>
                            <?php else: ?>
                                <?=$value?>
                            <?php endif ?>
                        </td>
                    <?php endforeach ?>
  #4 (permalink)  
Antiguo 29/10/2018, 18:31
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: array_intersect() no funciona en un if

Cita:
Iniciado por quico5 Ver Mensaje
Hola hhs, gracias por responder, aunque me has dejado desconcertado, espero hacerlo mejor ahora

Veamos, la consulta SQL devuelve varias filas, la idea es comparando cada fila con un array adicional como filtro, de tal manera que solo se muestren los campos necesarios, lo raro es que no funcione en el IF, porque el print_r lo hace correctamente

Código PHP:
        <?php foreach (mysqli_query($cnx,$query) as $value): ?>

            <?php print_r(array_intersect(array_keys($value),['id_socio','nombre','apellidos'])) ?>




            <?php if (array_intersect(array_keys($value),['id_socio','nombre','apellidos','edad'])): ?>
                <tr>
                    <?php foreach ($value as $key => $value): ?>
                        <td>
                            <?php if ($key=='edad'): ?>
                                <?=date_diff(date_create($value),date_create(date('Y-m-d')))->format('%y')?>
                            <?php else: ?>
                                <?=$value?>
                            <?php endif ?>
                        </td>
                    <?php endforeach ?>
Esto te marca un error o cual es el problema ?
Por otro lado algo que me llama la atención es que en ningun momento llamas a mysqli_fetch_assoc así que dudo que el print_r se ejecute correctamente.
por ultimo el if va a funcionar mientras intersect regrese un arreglo no vacío, y tienes que tener en cuenta que $value puede valer null y eso va a producir un error.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 29/10/2018, 19:49
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: array_intersect() no funciona en un if

Gracias por responder hhs

Primero hice la prueba con print_r, viendo que items coinciden entre los 2 arrays para luego mostrarlos

Luego hice el IF, para recuperar nuevamente los items iguales entre arrays, pero no se filtraban y me devolvia todos
  #6 (permalink)  
Antiguo 30/10/2018, 08:53
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años
Puntos: 120
Respuesta: array_intersect() no funciona en un if

lo mejor que puedes hacer es hacer uso de array_intersect_key que es el que mas se adapta a lo que necesitas

Código PHP:
Ver original
  1. $default =array(
  2.    "a"=>'',
  3.    "b"=>'empty'
  4. );
  5. $array = array("a"=>'esto es info','c'=>'importante','password'=>'123456');
  6. $resultado = array_intersect_key($array, $default);
  7. print_r($resultado)
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9
  #7 (permalink)  
Antiguo 30/10/2018, 15:05
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: array_intersect() no funciona en un if

de las dos formas debe de funcionar, si haces una prueba unitaria para los dos opciones y agregas diferentes casos puedes comprobar que funcionan. no existe motivo para que den otro valor.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #8 (permalink)  
Antiguo 31/10/2018, 06:12
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: array_intersect() no funciona en un if

Opino lo mismo pero estoy desconcertado:

Sacar no comunes con array_diff:
array_diff(['a','b',1,2],[1,2,3,4]):
print_r obtengo ['a','b',3,4]
mientras que con if obtengo ['a','b',1,2,3,4] ejecutandose siempre, me parece imposible porque no evaluo nada más en el if

No lo entiendo

Tambien he probado con los comunes con array_intersect:
array_intersect(['a','b',1,2],[1,2,3,4]), y me pasa lo mismo:
print_r obtengo [1,2]
mientras que con el if obtengo ['a','b',1,2,3,4]

En lugar de comparar 2 arrays, si me funciona comparar un array con una palabra, cosa que me desconcierta, no encuentro que podria estar haciendo mal
Código PHP:
IF y PRINT_R debuelve el mismo resultado esperadopero no compara 2 array
in_array($key,['socio']) 
Todo el código
Código HTML:
<?php
	$cols=['*','id_socio,socio,apellidos,edad,colegio','tel&eacute;fono'][1];

	if (isset($args[1]))
		if (strpos($_SERVER['QUERY_STRING'],'edad')){
			if ($args[1]=='asc') $query="SELECT $cols FROM $cont ORDER BY $args[0] ASC";
			if ($args[1]=='desc') $query="SELECT $cols FROM $cont ORDER BY $args[0] DESC";
		}else{
			if ($args[1]=='desc') $query="SELECT $cols FROM $cont ORDER BY $args[0] ASC";
			if ($args[1]=='asc') $query="SELECT $cols FROM $cont ORDER BY $args[0] DESC";
		}
	else $query="SELECT $cols FROM $cont";
	
?>
<?php #SHOW COLUMNS FROM $cont ?>
<?php #strncmp($value,'id_',3)&&print(str_replace('_',' ',ucfirst($value))).'<br>'; ?>

<table class="table table-striped table-dark">
	<thead class="">
		<?php foreach (mysqli_query($cnx,"SELECT $cols FROM $cont LIMIT 1") as $table): ?>
			<tr>
				<?php foreach (array_keys($table) as $value): ?>
					<th>
						<a href="<?= S.$cont.S.$metd.S.$value.S.(isset($args[1])&&$args[1]=='desc'?'asc':'desc') ?>">
							<?php strncmp($value,'id_',3)&&print(str_replace(['_','Socio'],[' ','Nombre'],ucfirst($value))) ?>
						</a>
					</th>
				<?php endforeach ?>
			</tr>
		<?php endforeach ?>
	</thead>
	<tbody>
		<?php foreach (mysqli_query($cnx,$query) as $table): ?>
			<tr>
				<?php foreach ($table as $key => $value): ?>
					<td>
						<?php if (in_array($key,['socio'])): ?>
							<a href="<?= S.$cont.S.'ver'.S.str_replace(' ','_',$table['socio'].S.$table['apellidos']) ?>">
								<?php if ($key=='edad'): ?>
									<?=date_diff(date_create($value),date_create(date('Y-m-d')))->format('%y')?>
								<?php else: ?>
									<?=$value?>
								<?php endif ?>
							</a>
						<?php else: ?>
							<?php if ($key=='edad'): ?>
								<?=date_diff(date_create($value),date_create(date('Y-m-d')))->format('%y')?>
							<?php else: ?>
								<?=$value?>
							<?php endif ?>
						<?php endif ?>
					</td>
				<?php endforeach ?>
			</tr>
		<?php endforeach ?>
		<tr></tr>
	</tbody>
</table> 
  #9 (permalink)  
Antiguo 31/10/2018, 06:15
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: array_intersect() no funciona en un if

Opino lo mismo pero estoy desconcertado:

Sacar no comunes con array_diff:
array_diff(['a','b',1,2],[1,2,3,4]):
print_r obtengo ['a','b',3,4]
mientras que con if obtengo ['a','b',1,2,3,4] ejecutandose siempre, me parece imposible porque no evaluo nada más en el if

No lo entiendo

Tambien he probado con los comunes con array_intersect:
array_intersect(['a','b',1,2],[1,2,3,4]), y me pasa lo mismo:
print_r obtengo [1,2]
mientras que con el if obtengo ['a','b',1,2,3,4]

En lugar de comparar 2 arrays, si me funciona comparar un array con una palabra, cosa que me desconcierta, no encuentro que podria estar haciendo mal
Código PHP:
IF y PRINT_R debuelve el mismo resultado esperadopero no compara 2 array
in_array($key,['socio']) 
Todo el código
Código HTML:
 <?php foreach (mysqli_query($cnx,"id_socio,socio,apellidos,edad") as $table): ?>
			<tr>
				<?php foreach ($table as $key => $value): ?>
					<td>
------------->				<?php if (array_diff($table,['socio','apellidos'])): ?>
							<a href="<?= S.$cont.S.'ver'.S.$table['socio'].S.$table['apellidos'] ?>">
								<?php if ($key=='edad'): ?>
									<?=date_diff(date_create($value),date_create(date('Y-m-d')))->format('%y')?>
								<?php else: ?>
									<?=$value?>
								<?php endif ?>
							</a>
						<?php else: ?>
							<?php if ($key=='edad'): ?>
								<?=date_diff(date_create($value),date_create(date('Y-m-d')))->format('%y')?>
							<?php else: ?>
								<?=$value?>
							<?php endif ?>
						<?php endif ?>
					</td>
				<?php endforeach ?>
			</tr>
		<?php endforeach ?> 

Última edición por quico5; 31/10/2018 a las 07:22
  #10 (permalink)  
Antiguo 31/10/2018, 09:17
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: array_intersect() no funciona en un if

Pense que te darias cuenta de tu error haciendo las pruebas. Pero bueno vamos a verlo de forma simple usando tus pruebas.

Dices que con una prueba como esta array_intersect(['a','b',1,2],[1,2,3,4]), obtienes un array con los elemento correctos, y cuando pasa el if los pierdes obteniendo este resultado ['a','b',1,2,3,4]. Bien dejame decirte que eso no tiene nada de extraño, eso es lo que debe de pasar y es porque en tu ejemplo inicial y en tus pruebas estas perdiendo el array en la condición porque solo evaluas que te regrese un array y no lo estas asignando.

¿Donde esta el truco?
Sencillo, tu tienes de forma general esto:
Código PHP:
Ver original
  1. $data = ['a','b',1,2];
  2.  
  3. print_r(array_intersect($data,[1,2,3,4]));
  4.  
  5. //aparente comportamiento extraño
  6. if (array_intersect($data,[1,2,3,4])) {
  7.     print_r($data);
  8. }
Si ejecutas eso, en el print_r dentro del if obtienes todos los elementos, lo que es normal. Si quieres los elementos "filtrados" tienes que hacer lo siguiente
Código PHP:
Ver original
  1. print_r(array_intersect($data,[1,2,3,4]));
  2. //obtenemos lo que se requiere
  3. if ($data = array_intersect($data,[1,2,3,4])) {
  4.     print_r($data);
  5. } else {
  6.     echo "\nArray vacio";
  7. }
Puedes probar esto aquí: http://sandbox.onlinephpfunctions.co...6623711919bc3a

Con el ultimo fragmento de código, obtienes lo que esperas, en tu ejemplo inicial, ese es el problema; nunca filtras el arreglo con array_intersect!!!

Esto debiera de solucionar el enigma:
Código PHP:
Ver original
  1. <?php if ($value = array_intersect(array_keys($value),['id_socio','nombre','apellidos','edad'])): ?>
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Última edición por hhs; 31/10/2018 a las 12:02
  #11 (permalink)  
Antiguo 01/11/2018, 07:22
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: array_intersect() no funciona en un if

Tanta edición de PHP que ya ni se si me falta o me sobra código

A continuación pongo una foto y el código, por un lado se ve que realmente solo muestro SOCIO y APELLIDOS, pero por otro me muestra todo, algo se me está escapando, porque la documentación no se equivoca http://php.net/manual/en/function.array-intersect.php y esto ya lo hiciera en algo similar hace tiempo, o al menos eso me suena



Código PHP:
        <?php foreach (mysqli_query($cnx,$query) as $table): ?>
            <tr>
                <?php #print_r($table) ?>
                <?php foreach ($table as $key => $value): ?>
                    <?php #print_r($key) ?>
                    <?php print_r(array_intersect(array_keys($table),['socio','apellidos'])) ?>
                    <td>
                        <?php if (array_intersect(array_keys($table),['socio','apellidos'])): ?>
                            <a href="<?= S.$cont.S.'ver'.S.str_replace(' ','_',$table['socio'].S.$table['apellidos']) ?>">
                                <?php if ($key=='edad'): ?>
                                    <?=date_diff(date_create($value),date_create(date('Y-m-d')))->format('%y')?>
                                <?php else: ?>
                                    <?=$value?>
                                <?php endif ?>
                            </a>
                        <?php else: ?>
                            <?php if ($key=='edad'): ?>
                                <?=date_diff(date_create($value),date_create(date('Y-m-d')))->format('%y')?>
                            <?php else: ?>
                                <?=$value?>
                            <?php endif ?>
                        <?php endif ?>
                    </td>
                <?php endforeach ?>
            </tr>
        <?php endforeach ?>

Última edición por quico5; 01/11/2018 a las 07:32
  #12 (permalink)  
Antiguo 01/11/2018, 08:03
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: array_intersect() no funciona en un if

Resuelto al fin, gracias por las sujerencias

Código PHP:
<?php
    $cols
=['*','id_socio,socio,apellidos,edad,colegio,teléfono'][0];

    if (isset(
$args[1]))
        if (
strpos($_SERVER['QUERY_STRING'],'edad')){
            if (
$args[1]=='asc'$query="SELECT $cols FROM $cont ORDER BY $args[0] ASC";
            if (
$args[1]=='desc'$query="SELECT $cols FROM $cont ORDER BY $args[0] DESC";
        }else{
            if (
$args[1]=='desc'$query="SELECT $cols FROM $cont ORDER BY $args[0] ASC";
            if (
$args[1]=='asc'$query="SELECT $cols FROM $cont ORDER BY $args[0] DESC";
        }
    else 
$query="SELECT $cols FROM $cont";
?>

<table class="table table-striped table-dark">
    <thead class="">
        <?php foreach (mysqli_query($cnx,"SELECT $cols FROM $cont LIMIT 1") as $table): ?>
            <tr>
                <?php foreach (array_keys($table) as $key): ?>
                    <?php if (in_array($key,['socio','apellidos'])||0): ?>
                        <th>
                            <a href="<?= S.$cont.S.$metd.S.$value.S.(isset($args[1])&&$args[1]=='desc'?'asc':'desc'?>">
                                <?php strncmp($key,'id_',3)&&print(str_replace(['_','Socio'],[' ','Nombre'],ucfirst($key))) ?>
                            </a>
                        </th>
                    <?php endif ?>
                <?php endforeach ?>
            </tr>
        <?php endforeach ?>
    </thead>
    <tbody>
        <?php foreach (mysqli_query($cnx,$query) as $table): ?>
            <tr>
                <?php foreach ($table as $key => $value): ?>
                    <?php if (in_array($key,['socio','apellidos'])): ?>
                        <td>
                            <a href="<?= S.$cont.S.'ver'.S.str_replace(' ','_',$table['socio'].S.$table['apellidos']) ?>">
                                <?php if ($key=='edad'): ?>
                                    <?=date_diff(date_create($value),date_create(date('Y-m-d')))->format('%y')?>
                                <?php else: ?>
                                    <?=$value?>
                                <?php endif ?>
                            </a>
                        </td>
                     <?php endif ?>
                <?php endforeach ?>
            </tr>
        <?php endforeach ?>
        <tr></tr>
    </tbody>
</table>:-)

Etiquetas: Ninguno
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:32.