web-dev-qa-db-fra.com

PHP - récupère toutes les clés d'un tableau commençant par une certaine chaîne

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-?

71
Alex
$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);
}
17
Developer-Sid

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();
}
114
erisco

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...
    }
}
37
user613857

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')
16
biziclop
foreach($arr as $key => $value)
{
   if(preg_match('/^foo-/', $key))
   {
        // You can access $value or create a new array based off these values
   }
}
13
Tim Cooper

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

12
Suresh Velusamy

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.

7
Keyur K

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
)
*/
1
Netsurfer