0 レビュー
7 回答
php-キーの一部で配列をフィルタリングする方法は?
次のような配列があります:
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;
}
キーの一部でフィルタリングしたい。この場合、「id-」を持つすべてのキーが必要であり、その結果は次のようになります。
Array(
[id-1] => N
[id-48] => S
[id-52] => N
[id-49] => N
[id-50] => N
}
誰か助けてもらえますか?
わからない
0
レビュー
答え :
解決策:
foreach (array_keys($array) as $key) {
if (!preg_match('/^id-\d+/', $key)) {
unset($array[$key]);
}
}
わからない
0
レビュー
答え :
解決策:
この方法で行うことができます。
$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
わからない
0
レビュー
答え :
解決策:
次を使用します(テストされていません):
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);
わからない
0
レビュー
答え :
解決策:
array_filter と同様に機能する小さな関数を記述できます:
<?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)
;
}
プリント
array(5) {
["id-1"]=>
int(0)
["id-48"]=>
int(2)
["id-52"]=>
int(4)
["id-49"]=>
int(6)
["id-50"]=>
int(8)
}
わからない
0
レビュー
答え :
解決策:
試してみてください:
$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;
}
}
わからない
0
レビュー
答え :
解決策:
インターネット上で、array_intersect_keyを利用する回答は正しくありません。 それらは正しくフィルタリングされますが、入力配列値の代わりに「フィルタリングされたキーインデックス」値を出力します。
これが修正バージョンです
/**
* Filter array keys by callback
*
* @param array $input
* @param $callback
* @return NULL|unknown|multitype:
*/
function array_filter_keys($input, $callback)
{
if (!is_array($input)) {
trigger_error('array_filter_key() expects parameter 1 to be array, ' . gettype($input) . ' given', E_USER_WARNING);
return null;
}
if (empty($input)) {
return $input;
}
$filteredKeys = array_filter(array_keys($input), $callback);
if (empty($filteredKeys)) {
return array();
}
$input = array_intersect_key($input, array_flip($filteredKeys));
return $input;
}
わからない
0
レビュー
答え :
解決策:
最新のPHPバージョンを使用している場合:
$filtered_arr = array_filter($arr, 'filter_my_array', ARRAY_FILTER_USE_KEY);
function filter_my_array( $key ) {
return preg_match("/^id-\d+/", $key);
}
わからない
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。