0

I have 2 arrays, $categories_filters and $adds_filters. They both return results. When printed using print_r, they return data in following format:

$categories_filters returns data like this:

Array
(
[0] => Array
    (
        [filterid] => 67
        [catid] => 1
        [filtername] => FILTERNAME1
        [sorder] => 1
        [visible] => 1
    )

[1] => Array
    (
        [filterid] => 68
        [catid] => 1
        [filtername] => FILTERNAME155
        [sorder] => 2
        [visible] => 1
    )
    .....

$adds_filters returns the following:

  Array
(
[0] => Array
    (
        [addfilterid] => 9
        [addid] => 5
        [filterid] => 67
    )

[1] => Array
    (
        [addfilterid] => 10
        [addid] => 5
        [filterid] => 163
    )

)....

I am trying the following: I have checkbox for each value in the $categories_filters. If the filterid exists in the $adds_filters array, i want that checkbox to be checked, otherwise, i want that checkbox just to be displayed unchecked.

I am trying to achieve that with the following code:

if($categories_filters) {
    foreach ($categories_filters as $key1=>$value){
        echo "<div class='chb_group'>";
        echo "<span class='custom_chb_wrapper'>";
        foreach ($adds_filters as $key2=>$af) {
            if($af['filterid'] == $value['filterid']) {
                echo "<input type='checkbox' name='categoriesfilters[]' id= '".$value['filterid']."'  value='" .$value['filterid'] ."'  checked = 'checked' class='zcheckbox' />";    
            } else  {
                echo "<input type='checkbox' name='categoriesfilters[]' id= '".$value['filterid']."'  value='" .$value['filterid'] ."' class='zcheckbox' />";
            }
        } 
        echo "<label>" .$value['filtername']. "</label>";
        echo "</span>";
        echo "</div>"
    } 
}else {
    echo  "No filters"; 
}

Quick catchers will realize that I get 2 checkboxes displayed for each value in the arrays, instead of one (checked or unchecked)

I guess that different approach is needed here.

1 Answer 1

1

One suggestion would be that instead of looping through the entire $adds_filters array everytime, store all the 'filterid' into a variable and just check if the $value['filterid'] exists inside that array.
The code below uses functions in_array and array_map.
Try this -

if($categories_filters) {
    //Added this
    $addfilterids = array_map(function($v){return $v['filterid'];}, $adds_filters);

    foreach ($categories_filters as $key1=>$value){
        echo "<div class='chb_group'>";
        echo "<span class='custom_chb_wrapper'>";
        
        //Modified from here-
        if(in_array($value['filterid'], $addfilterids)){
            echo "<input type='checkbox' name='categoriesfilters[]' id= '".$value['filterid']."'  value='" .$value['filterid'] ."'  checked = 'checked' class='zcheckbox' />";    
        }else{
            echo "<input type='checkbox' name='categoriesfilters[]' id= '".$value['filterid']."'  value='" .$value['filterid'] ."' class='zcheckbox' />";
        }
        //^Modified uptil here.
        
        echo "<label>" .$value['filtername']. "</label>";
        echo "</span>";
        echo "</div>"
    } 
}
Sign up to request clarification or add additional context in comments.

2 Comments

The above code do return all checkboxes only once, but none of them is checked. let me see if i can spot any mistake...
Basically I had compared 'addfilterid' and not 'filterid'. It should probably work now.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.