2 votes

Comment filtrer un tableau par une partie de la clé ?

J'ai un tableau comme celui-ci :

Array(
[id-1] => N
[nm-1] => my_val_01;
[id-48] => S
[nm-48] => my_val_02;
[id-52] => N
[nm-52] => my_val_03;
[id-49] => N
[nm-49] => my_val_04;
[id-50] => N
[nm-50] => my_val_05;
}

et souhaite filtrer par partie de la clé. Dans ce cas, j'aimerais avoir toutes les clés qui ont "id-", et obtenir le résultat suivant :

Array(
[id-1] => N
[id-48] => S
[id-52] => N
[id-49] => N
[id-50] => N
}

Quelqu'un peut-il nous aider ?

3voto

deceze Points 200115
foreach (array_keys($array) as $key) {
    if (!preg_match('/^id-\d+/', $key)) {
        unset($array[$key]);
    }
}

1voto

rajesh Points 823

Vous pouvez le faire de cette façon.

$arr = Array(
[id-1] => N
[nm-1] => my_val_01;
[id-48] => S
[nm-48] => my_val_02;
[id-52] => N
[nm-52] => my_val_03;
[id-49] => N
[nm-49] => my_val_04;
[id-50] => N
[nm-50] => my_val_05;
};
$new = array();
foreach($arr as $key => $value){
  if(stripos($key, "id-") !== false){
   $new[$key] = $value;
  }
}
//so $new is your required array here

0voto

hsz Points 46509

Essayez avec :

$input  = array( /* your data */ );
$output = array();
$pattern = 'id-';

foreach ( $input as $key => $value ) {
  if ( strpos($key, $pattern) === 0 ) { # Use identical not equal operator here
    $output[$key] = $value;
  }
}

0voto

Tim Čas Points 1767

Utilisez les éléments suivants (non testés) :

function filter($key) {
    return substr($key, 0, 3) == 'id-';
}

$keys = array_filter(array_keys($array), 'filter');
if(empty($keys))
    $array = array();
else
    $array = array_intersect_key(array_flip($keys), $input);

0voto

VolkerK Points 54118

Vous pouvez écrire une petite fonction qui fonctionne de manière analogue à filtre_de_tableau :

<?php
$a = array(
    'id-1' => 'N', 'nm-1' => 'my_val_01', 'id-48' => 'S', 'nm-48' => 'my_val_02', 'id-52' => 'N',
    'nm-52' => 'my_val_03', 'id-49' => 'N', 'nm-49' => 'my_val_04', 'id-50' => 'N', 'nm-50' => 'my_val_05'
);

$b = array_filter_key($a, function($e) {
    return 0===strpos($e, 'id-');
});
var_dump($b);

function array_filter_key($source, $callback)   {
    // TODO: check arguments
    $keys = array_keys($source);
    $keys = array_filter($keys, $callback);

    return ( 0===count($keys) ) ?
        array()
        :
        array_intersect_key(array_flip($keys), $source)
    ;
}

empreintes

array(5) {
  ["id-1"]=>
  int(0)
  ["id-48"]=>
  int(2)
  ["id-52"]=>
  int(4)
  ["id-49"]=>
  int(6)
  ["id-50"]=>
  int(8)
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X