PHP - Ciclo for devuelve valores duplicados

 
Vista:
sin imagen de perfil
Val: 79
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ciclo for devuelve valores duplicados

Publicado por Jonathan (40 intervenciones) el 23/09/2019 01:37:31
Hola soy nuevo en esta comunidad, así que desde ya muchas gracias a todos.

Tengo la siguiente problemática que no eh logrado resolver, tratare de explicarla de la mejor forma posible:
•Estoy realizando consultas a Mysql mediante PHP y Ajax, construyendo los elementos HTML de forma dinámica.
•Tengo una función en php que realiza una consulta a una base de datos devolviendo lo que se ve en la imagen 1.
Captura
•Como las consultas se generan con Ajax y algunas cambian en función de otra, cada ves que se generan los checkbox se borra el check, por lo tanto implemente la siguiente función en PHP para mantener los check marcados según corresponda.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$marca = $this->filtro_marcas();
for ($p=0,$rows=count($marca);$p<$rows;$p++) {
    if(isset($_POST['marca'])){
        $marca_seleccionada = $_POST['marca'];
        for ($i=0,$size=count($marca_seleccionada);$i<$size;$i++) {
            if ($marca_seleccionada[$i] == $marca[$p]['marca']){
                $filtrosHTML .= '<li class="nav-item"><input checked type="checkbox" class="filtro_seleccionado marca" value="'.$marca[$p]['marca'].'"> '. $marca[$p]['marca'].'</li>';
                }else{
                $filtrosHTML .= '<li class="nav-item"><input type="checkbox" class="filtro_seleccionado marca" value="'.$marca[$p]['marca'].'"> '. $marca[$p]['marca'].'</li>';
            }
        }
    }else{
        $filtrosHTML .= '<li class="nav-item"><input type="checkbox" class="filtro_seleccionado marca" value="'.$marca[$p]['marca'].'"> '. $marca[$p]['marca'].'</li>';
    }
}

•De este modo cuando presiono sobre alguna marca mediante el checkbox este si logra mantenerse con el check como se ve en la imagen, cabe mencionar que tengo una función en Javascript que envia un array con el valor de los checkbox seleccionados.
Captura2

El problema surge a la hora de seleccionar una segunda marca, ya que los valores se duplican y se ven como en la imagen
Captura3

Agradecería mucho su ayuda, ya que no logro comprender porque sucede esto, y de antemano muchas gracias a toda la comunidad.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ciclo for devuelve valores duplicados

Publicado por joel (1269 intervenciones) el 23/09/2019 12:18:09
Hola Jonathan, me da la sensación que esa función php que has creado, es para tapar un problema que tienes con el ajax... yo eliminaría el código PHP y revisaría exactamente que esta pasando con el jquery... ya que si intentas solucionar con otro código que no se dupliquen los valores, estas poniendo parches en vez de solucionar un problema de raíz.

Cada vez que seleccionas un elemento se hace una llamada mediante ajax al servidor?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 79
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ciclo for devuelve valores duplicados

Publicado por Jonathan (40 intervenciones) el 23/09/2019 12:36:50
Hola estimado, le explico, tengo dos listas de checkbox una para las categorías y otra para las marcas, las cuales en un principio eran de forma estática, es decir incluía el código directamente en HTML por lo que se quedaba de forma estática, pero no me servía, ya que las marcas varían en función de la categoría seleccionada y viceversa, por lo tanto lo construi de forma dinámica mediante Ajax y Php, el problema venía ya que cada ves que seleccionó un checkbox la consulta cambia, por lo tanto al estar creada la consulta y los checkbox de forma dinámica se borraba el ticket del checkbox, por eso intente implementar el código mencionado, existe alguna forma de mantener el check después de solicitar los datos mediante ajax?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 3.828
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ciclo for devuelve valores duplicados

Publicado por joel (1269 intervenciones) el 23/09/2019 15:26:09
Hola Jonathan, entiendo que si la consulta cambia, también deberían de cambiar los checkbox, no? pero si solo pueden cambiar algunos, lo que tendrías que hacer desde el javascript, es añadir los nuevos y quitar los que ya no estarán, pero los que se repiten dejarlos, tanto si están con el check como si no.

No se si me he sabido explicar... pero no tienes que reemplazarlos todos por lo que te viene del php... si no que tienes que analizar lo que te viene del php desde javascript
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 79
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Ciclo for devuelve valores duplicados

Publicado por Jonathan (40 intervenciones) el 23/09/2019 16:56:24
Estimado, tratare de detallar como estaba antes y como esta actualmente.
De esta forma se encontraba la sección de los filtros con los checkbox, la cual era estática y los checkbox después de solicitar los datos si se mantenían, lo cual no me servía ya que los filtros varían en función de la consulta.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<script src="<?php echo $raiz;?>logica/busqueda.js"></script>
    <div class="container">
    <?php include '../logica/Product.php'; $productos = new Productos();?>
	    <div class="row">
            <div class="col-xl-3 col-lg-3 col-md-12 filtros_productos">
                <ul class="nav flex-column">
                    <li class="nav-item tipo_filtros">
                        <button class="btn w-100" type="button"><h4>Categorias<span class="icon-chevron-down"></span></h4></button>
                        <ul class="nav flex-column categoria_filtros">
                            <?php $categoria = $productos->filtro_categorias(); foreach($categoria as $listado_categorias){ ?>
                            <li class="nav-item"><input type="checkbox" class="filtro_seleccionado categoria" value="<?php echo $listado_categorias['categoria']; ?>" > <?php echo $listado_categorias['categoria']; ?></li>
			       	        <?php }?>
                       </ul>
                    </li>
                    <li class="nav-item tipo_filtros">
                        <button class="btn w-100" type="button"><h4>Marcas<span class="icon-chevron-down"></span></h4></button>
                        <ul class="nav flex-column categoria_filtros">
                            <?php $marca = $productos->filtro_marcas();foreach($marca as $listado_marcas){?>
                            <li class="nav-item"><input type="checkbox" class="filtro_seleccionado marca" value="<?php echo $listado_marcas['marca']; ?>"  > <?php echo $listado_marcas['marca']; ?></li>
                            <?php }?>
                        </ul>
                    </li>
                </ul>
            </div>
        </div>
    </div>
Por lo cual decidí pasarlo vía Php y Ajax de la siguiente forma, pero los checkbox se borraba su estado de seleccionado cada ves que cambiaba la consulta, por lo tanto para probar modifique la parte de las marcas, ya que la parte de las categorías se mantuvo tal cual estaba antes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public function filtros(){
    $categoria = $this->filtro_categorias();
    $marca = $this->filtro_marcas();
    $filtrosHTML = '<ul class="nav d-lg-none pt-4 justify-content-between nav_filtros">
                        <li class="nav-item flex-child"><span><i class="icon-filter"></i></span></li>
                        <li class="nav-item flex-child"><p class="text-lead">Filtrar por:</p></li>
                        <li class="nav-item flex-child"><span><i class="icon-cross1"></i></span></li>
                    </ul>
                    <ul class="nav flex-column">
                        <li class="nav-item tipo_filtros">
                            <button class="btn w-100" type="button"><h4>Categorias<span class="icon-chevron-down"></span></h4></button>
                            <ul class="nav flex-column categoria_filtros">';
    foreach($categoria as $listado_categorias){
        $filtrosHTML .=         '<li class="nav-item"><input type="checkbox" class="filtro_seleccionado categoria" value="'.$listado_categorias['categoria'].'"> '. $listado_categorias['categoria'].'</li>';
        }
    $filtrosHTML .=        '</ul>
                        </li>
                        <li class="nav-item tipo_filtros">
                            <button class="btn w-100" type="button"><h4>Marcas<span class="icon-chevron-down"></span></h4></button> 
                            <ul class="nav flex-column categoria_filtros">';
     for ($p=0,$rows=count($marca);$p<$rows;$p++) {
        if(isset($_POST['marca'])){
            $marca_seleccionada = $_POST['marca'];
            for ($i=0,$size=count($marca_seleccionada);$i<$size;$i++) {
                if ($marca_seleccionada[$i] == $marca[$p]['marca']){
                    $filtrosHTML .= '<li class="nav-item"><input checked type="checkbox" class="filtro_seleccionado marca" value="'.$marca[$p]['marca'].'"> '. $marca[$p]['marca'].'</li>';
                    }else{
                    $filtrosHTML .= '<li class="nav-item"><input type="checkbox" class="filtro_seleccionado marca" value="'.$marca[$p]['marca'].'"> '. $marca[$p]['marca'].'</li>';
                }
                }
            }else{
            $filtrosHTML .= '<li class="nav-item"><input type="checkbox" class="filtro_seleccionado marca" value="'.$marca[$p]['marca'].'"> '. $marca[$p]['marca'].'</li>';
            }
        }
    $filtrosHTML .=        '</ul>
                        </li>';
    $filtrosHTML .='</ul>';
    return $filtrosHTML;
}

Y este es el Js para traer los datos mediante Ajax
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$('.filtros_productos').on('click','.filtro_seleccionado',function(){
        filtrado_productos();
 
});
 
 
function filtrado_productos(CantidadPagina, PaginaNumero) {
	$('.searchResult').html('<div id="loading">Cargando .....</div>');
	var action = 'fetch_data';
	var marca = obtener_filtros('marca');
	var categoria = obtener_filtros('categoria');
    var PaginaNumero = PaginaNumero;
    var CantidadPagina = CantidadPagina;
    var Option = obtener_option();
	$.ajax({
		url:"../logica/action.php",
        method: "POST",
        dataType: "json",
		data:{ action:action, marca:marca, categoria:categoria, CantidadPagina:CantidadPagina,PaginaNumero:PaginaNumero,Option:Option},
        beforeSend: function() {
                $('.listado_productos').html('<div id="loading">Cargando .....</div>');
            },
        success:function(data){
			$('.listado_productos').html(data.html);
            $('.paginator').html(data.html2);
            $('.resultados_mostrados').html(data.html3);
            $('.filtros').html(data.html4);
            $('.prueba2').html(data.html5);
		}
	});
}

Y este es el Js que obtiene el valor de los checkbox
1
2
3
4
5
6
7
function obtener_filtros(className) {
	var filter = [];
	$('.'+className+':checked').each(function(){
		filter.push($(this).val());
	});
	return filter;
}

Espero sirva el poner los códigos, ya que es la única traba que tengo por el momento y no se como resolverlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar