J'ai un tableau qui ressemble à ceci:
array(
'abc' => 0,
'foo-bcd' => 1,
'foo-def' => 1,
'foo-xyz' => 0,
// ...
)
Comment puis-je obtenir uniquement les éléments commençant par foo-
?
$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);
}
Approche fonctionnelle:
Prenez un array_filter_key
sorte de fonction des commentaires dans http://php.net/array_filter ou écrivez la vôtre. Ensuite, vous pourriez faire:
$array = array_filter_key($array, function($key) {
return strpos($key, 'foo-') === 0;
});
Approche procédurale:
$only_foo = array();
foreach ($array as $key => $value) {
if (strpos($key, 'foo-') === 0) {
$only_foo[$key] = $value;
}
}
Approche procédurale utilisant des objets:
$i = new ArrayIterator($array);
$only_foo = array();
while ($i->valid()) {
if (strpos($i->key(), 'foo-') === 0) {
$only_foo[$i->key()] = $i->current();
}
$i->next();
}
C'est ainsi que je le ferais, bien que je ne puisse pas vous donner de conseils plus efficaces avant de comprendre ce que vous voulez faire avec les valeurs que vous obtenez.
$search = "foo-";
$search_length = strlen($search);
foreach ($array as $key => $value) {
if (substr($key, 0, $search_length) == $search) {
...use the $value...
}
}
Depuis PHP 5.3 vous pouvez utiliser le preg_filter
fonction: ici
$unprefixed_keys = preg_filter('/^foo-(.*)/', '$1', array_keys( $arr ));
// Result:
// $unprefixed_keys === array('bcd','def','xyz')
foreach($arr as $key => $value)
{
if(preg_match('/^foo-/', $key))
{
// You can access $value or create a new array based off these values
}
}
J'ai simplement utilisé array_filter
fonction pour obtenir la solution comme suit
<?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);
Sortie
Array
(
[foo-bcd] => 1
[foo-def] => 1
[foo-xyz] => 0
)
Pour une vérification en direct https://3v4l.org/lJCse
Modification de l'approche fonctionnelle de erisco,
array_filter($signatureData[0]["foo-"], function($k) {
return strpos($k, 'foo-abc') === 0;
}, ARRAY_FILTER_USE_KEY);
cela a fonctionné pour moi.
En plus de la réponse de @Suresh Velusamy ci-dessus (qui nécessite au moins PHP 5.6.0), vous pouvez utiliser ce qui suit si vous utilisez une version antérieure de 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
)
*/