I have an array that looks like this:
array(
'abc' => 0,
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
// ...
)
How can I retain only the elements that start with foo-?
I have an array that looks like this:
array(
'abc' => 0,
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
// ...
)
How can I retain only the elements that start with foo-?
Functional approach:
$array = array_filter($array, function($key) {
return strpos($key, 'foo-') === 0;
}, ARRAY_FILTER_USE_KEY);
Procedural approach:
$only_foo = array();
foreach ($array as $key => $value) {
if (strpos($key, 'foo-') === 0) {
$only_foo[$key] = $value;
}
}
Procedural approach using objects:
$i = new ArrayIterator($array);
$only_foo = array();
while ($i->valid()) {
if (strpos($i->key(), 'foo-') === 0) {
$only_foo[$i->key()] = $i->current();
}
$i->next();
}
array_filter(), which you can use instead of supplying a custom array_filter_key() function.array_filter_key() is not a native function. Researchers shouldn't have to link-chase to receive the whole solution.str_starts_with($key, 'foo-')This is how I would do it, though I can't give you a more efficient advice before understanding what you want to do with the values you get.
$search = "foo-";
$search_length = strlen($search);
foreach ($array as $key => $value) {
if (substr($key, 0, $search_length) == $search) {
...use the $value...
}
}
Simply I used array_filter function to achieve the solution as like follows
<?php
$input = array(
'abc' => 0,
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
);
$filtered = array_filter($input, function ($key) {
return strpos($key, 'foo-') === 0;
}, ARRAY_FILTER_USE_KEY);
print_r($filtered);
Output
Array
(
[foo-bcd] => 1
[foo-def] => 1
[foo-xyz] => 0
)
For live check https://3v4l.org/lJCse
From PHP 5.3 you can use the preg_filter function: here
$unprefixed_keys = preg_filter('/^foo-(.*)/', '$1', array_keys( $arr ));
// Result:
// $unprefixed_keys === array('bcd','def','xyz')
$arr_main_array = array('foo-test' => 123, 'other-test' => 456, 'foo-result' => 789);
foreach($arr_main_array as $key => $value){
$exp_key = explode('-', $key);
if($exp_key[0] == 'foo'){
$arr_result[] = $value;
}
}
if(isset($arr_result)){
print_r($arr_result);
}
foreach($arr as $key => $value)
{
if(preg_match('/^foo-/', $key))
{
// You can access $value or create a new array based off these values
}
}
Modification to erisco's Functional approach,
array_filter($signatureData[0]["foo-"], function($k) {
return strpos($k, 'foo-abc') === 0;
}, ARRAY_FILTER_USE_KEY);
this worked for me.
In addition to @Suresh Velusamy's answer above (which needs at least PHP 5.6.0) you can use the following if you are on a prior version of PHP:
<?php
$input = array(
'abc' => 0,
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
);
$filtered = array_filter(array_keys($input), function($key) {
return strpos($key, 'foo-') === 0;
});
print_r($filtered);
/* Output:
Array
(
[1] => foo-bcd
[2] => foo-def
[3] => foo-xyz
)
// the numerical array keys are the position in the original array!
*/
// if you want your array newly numbered just add:
$filtered = array_values($filtered);
print_r($filtered);
/* Output:
Array
(
[0] => foo-bcd
[1] => foo-def
[2] => foo-xyz
)
*/
$key => $value pair. It is stated in the output of this answer, but was not yet mentioned explicitlyFrom PHP5.6, the array keys can be the sole subject of the filtration by using the ARRAY_FILTER_USE_KEY constant/flag.
From PHP7.4, arrow functions make custom functions more concise and allow values to be passed into the custom function's scope without use().
From PHP8, str_starts_with() can take the place of strpos(...) === 0
Code: (Demo)
$array = [
'abc' => 0,
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
];
$prefix = 'foo';
var_export(
array_filter(
$array,
fn($key) => str_starts_with($key, $prefix),
ARRAY_FILTER_USE_KEY
)
);
Output:
array (
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
)
You might pass a key-value single dimensional array and a specific prefix string 'foo-' to the function just made: filter_array_key_with_prefix
<?php
function filter_array_key_with_prefix($arr, $prefix) {
return array_filter($arr, function($k) use ($prefix) {
return strpos($k, $prefix) === 0;
}, ARRAY_FILTER_USE_KEY);
}
$arr = array(
'abc' => 0,
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
// ...
);
$filtered = filter_array_key_with_prefix($arr, 'foo-');
var_dump($filtered);
Output:
array(3) {
["foo-bcd"]=>
int(1)
["foo-def"]=>
int(1)
["foo-xyz"]=>
int(0)
}