Here you go (I put some comments in to point out changes):
$c=<<<JSON
[{"type":"textarea","label":"textarea","Element_Values":"cfgedrgyte","Element_Name":"textarea-201859","Count_Images":0,"req":0}, {"type":"dropdown","label":"dropdownbox","Element_Values":"d2","Element_Name":"dropdown-480200","Count_Images":0,"req":0,"choices":[{"label":"d1","sel":0},{"label":"d2","sel":0}]},
{"type":"sub-header","label":"section3","Element_Values":"-","Element_Name":"sub-header-327336","Count_Images":0,"req":0},{"type":"checkbox","label":"checkbox","Element_Values":"[\"c1\",\"c2\"]","Element_Name":"checkbox-483738","Count_Images":0,"req":0,"choices":[{"label":"c1","sel":0},{"label":"c2","sel":0}]}, {"type":"radio","label":"radio","Element_Values":"\"r2\"","Element_Name":"radio-824113","Count_Images":0,"req":0,"choices":[{"label":"r1","sel":0}, {"label":"r2","sel":0}]},
{"type":"description","label":"test template is here","Element_Values":"-","Element_Name":"description-764196","Count_Images":0,"req":0}]
JSON;
//add second argument here
$c=json_decode($c,true);
//by refrence here
foreach($c as $kc=>&$vc)
{
//in array is prettier, if you want to expand on this it will be easier
//instead of another OR you just add another element, a switch would work too
if( in_array($vc['type'], ["checkbox","radio"]))
{
$Val=$vc['Element_Values'];
//This is double encoded. Sometimes its an array sometimes it's not
//So normailize it
if(gettype($Val) == 'string'){
//decode it if it's not an array
$Val = json_decode($Val);
//normalize to array
if($Val && !is_array($Val)) $Val = [$Val];
}
$choices =& $vc['choices']; //by refrence here
foreach($choices as $key=>&$val)
{
if(in_array($val['label'],$Val)) //Use in array
{
$val['sel']=1;
}
// unset($val['sel']); whats this for? it just unsets the above
}
}
}
print_r($c);
echo json_encode($c);
output
Array
(
[0] => Array
(
[type] => textarea
[label] => textarea
[Element_Values] => cfgedrgyte
[Element_Name] => textarea-201859
[Count_Images] => 0
[req] => 0
)
[1] => Array
(
[type] => dropdown
[label] => dropdownbox
[Element_Values] => d2
[Element_Name] => dropdown-480200
[Count_Images] => 0
[req] => 0
[choices] => Array
(
[0] => Array
(
[label] => d1
[sel] => 0
)
[1] => Array
(
[label] => d2
[sel] => 0
)
)
)
[2] => Array
(
[type] => sub-header
[label] => section3
[Element_Values] => -
[Element_Name] => sub-header-327336
[Count_Images] => 0
[req] => 0
)
[3] => Array
(
[type] => checkbox
[label] => checkbox
[Element_Values] => ["c1","c2"]
[Element_Name] => checkbox-483738
[Count_Images] => 0
[req] => 0
[choices] => Array
(
[0] => Array
(
[label] => c1
[sel] => 1
)
[1] => Array
(
[label] => c2
[sel] => 1
)
)
)
[4] => Array
(
[type] => radio
[label] => radio
[Element_Values] => "r2"
[Element_Name] => radio-824113
[Count_Images] => 0
[req] => 0
[choices] => Array
(
[0] => Array
(
[label] => r1
[sel] => 0
)
[1] => Array
(
[label] => r2
[sel] => 1
)
)
)
[5] => Array
(
[type] => description
[label] => test template is here
[Element_Values] => -
[Element_Name] => description-764196
[Count_Images] => 0
[req] => 0
)
)
Json
[{"type":"textarea","label":"textarea","Element_Values":"cfgedrgyte","Element_Name":"textarea-201859","Count_Images":0,"req":0},{"type":"dropdown","label":"dropdownbox","Element_Values":"d2","Element_Name":"dropdown-480200","Count_Images":0,"req":0,"choices":[{"label":"d1","sel":0},{"label":"d2","sel":0}]},{"type":"sub-header","label":"section3","Element_Values":"-","Element_Name":"sub-header-327336","Count_Images":0,"req":0},{"type":"checkbox","label":"checkbox","Element_Values":"[\"c1\",\"c2\"]","Element_Name":"checkbox-483738","Count_Images":0,"req":0,"choices":[{"label":"c1","sel":1},{"label":"c2","sel":1}]},{"type":"radio","label":"radio","Element_Values":"\"r2\"","Element_Name":"radio-824113","Count_Images":0,"req":0,"choices":[{"label":"r1","sel":0},{"label":"r2","sel":1}]},{"type":"description","label":"test template is here","Element_Values":"-","Element_Name":"description-764196","Count_Images":0,"req":0}]
Sandbox
UPDATE
This element is always double encoded, in the example data. $Val=$vc['Element_Values'];
It was missing the radio button the first time I did it. So now I have it decode it if its not an array and then check that the result is an array. The radio value was this "\"r2\""
Which when not decoded has an extra set of quotes '"r2"'
, but is a string when decoded. So we don't want to worry about 2 data types so we can just make that an array...
Cheers
BONUS
Instead of an if here:
if( in_array($vc['type'], ["checkbox","radio"]))
I changed this to in_array as it's easier to add to,
if( in_array($vc['type'], ["checkbox","radio","drowdown"]))
//instead of
if( $vc['type']=="checkbox" || $vc['type']=="radio" || $vc['type']=="drowdown")
but a switch is good too:
switch($vc['type']){
case 'checkbox':
case 'radio':
//... Code ...
break;
}
Then if you want to add code for other types:
switch($vc['type']){
case 'checkbox':
case 'radio':
//... Code ...
break;
case 'dropdown':
//... Code ...
break;
}
Using In array or a switch is just a bit cleaner IMO.