Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

tareenmj's avatar

I need to remove all elements from an associative array based on a variable name

I am reading input from the user (in Laravel) and have rules associated to each of those inputs. If the user selects a checkbox (for that specific table), I would like to remove all the rules from the $rules associative array for that table.

To better illustrate, I have created two arrays mimicking the behaviour.

My input array is as follows:

$input = array("TB1_course" => ['0'=>'CHEM 1E03', '1'=>'ENG 1D04'
                            ],  
          "TB1_section" => ['0'=>'CHEM 1E03', '1'=>'ENG 1D04'
                            ], 
          "TB1_checkbox" => "1",
          "TB2_course" => ['0'=>'CHEM 1E03', '1'=>'ENG 1D04'
                            ],
          "TB2_checkbox" => "0"
);

$rules= array(
    'TB1_course.*' => 'required_with',
    'TB1_section.*' =>'required_with',
    'TB2_course.*' =>'required_with'
);

You can see from the input array that TB1_checkbox has a value of 1. If it has a value of 1, I would like to remove all the rules associated with TB1 (i.e. remove the elements in $rules with a key containing 'TB1').

I attempted to do as such, and was partially successful. My code looks like:

foreach ($input as $key=>$value){//go thru every element of the inputs
    if ((strpos($key, 'checkbox')!==false) && $value==1){//if it contains 'checkbox' 
//and checkbox is selected

        $table_name= substr($key, 0,3);//name of table

        //now go thru $rules and remove all elements which contain a word of $table_name

        $rules=array_filter($rules, function($x){
            return strpos($x, $table_name)!==0;//problem lies here
        }, ARRAY_FILTER_USE_KEY);
    }
}

However my code isn't working. The strpos() function is unable to read the $table_name variable, and leads to problems. If I manually pass in a string, it ends up working (i.e. 'TB1' instead of $table_name), but I have to have the flexibility of checking all my tables (so the rules containing 'TB2' have to be removed if "TB2_checkbox" has a value of 1). Is there any way to solve this issue?

Thank you for the help.

0 likes
2 replies
Cronix's avatar

Why don't you go the opposite direction? Start with an empty rules array and add to the rules based on the conditions?

marthz's avatar
marthz
Best Answer
Level 17
$rules=array_filter($rules, function($x) use ($table_name){

Should do the trick.

1 like

Please or to participate in this conversation.