PHPの連想配列スライスへの割り当て
-
10-07-2019 - |
質問
perlでは、次のようにリストをハッシュの複数の値に割り当てることができます。
# define the hash...
my %hash = (
foo => 1,
bar => 2,
baz => 3,
);
# change foo, bar, and baz to 4, 5, and 6 respectively
@hash{ 'foo', 'bar', 'baz' } = ( 4, 5, 6 );
PHPで同じことを行う方法はありますか?実際、連想配列のスライスを取得する方法さえありますか?
解決
Perl構文に相当するものはありません。ただし、目的のキーの配列を作成し、それを使用して配列の一部のみを変更できます。
$koi=array('foo', 'bar', 'baz' );
foreach($koi as $k){
$myarr[$k]++; //or whatever
}
または
array_walk($myarr, create_function('&$v,$k','$v=(in_array($k,$koi))? $v*2 : $v;')); //you'd have to define $koi inside the function
他のヒント
シンプルなワンライナー(これらのメソッドの一部は、問い合わせ時に利用可能なものよりも新しいバージョンのPHPを必要とします):
$hash = array(
'foo'=>1,
'bar'=>2,
'baz'=>3,
);
$hash = array_merge( $hash, array( 'foo' => 4, 'bar' => 4, 'baz' => 5 ) );
array_merge のPHPマニュアルエントリ。
特定の配列キーのセットを取得する場合、これを使用できます:
$subset = array_intersect_key( $hash, array_fill_keys( array( 'foo', 'baz' ), '' ) );
array_intersect_key のPHPマニュアルエントリ array_fill_keys 。
ハッシュを定義します:
$hash = array(
'foo' => 1,
'bar' => 2,
'baz' => 3,
);
# change foo, bar, and baz to 4, 5, and 6 respectively
list($hash['foo'], $hash['bar'], $hash['baz']) = array( 4, 5, 6 );
# or change one by one
$hash['foo'] = 1;
$hash['bar'] = 2;
$hash['baz'] = 3;
マニュアルのlist()関数を参照してください:
要するに、いいえ。ただし、次のような関数を使用できます。
function assignSlice($ar,$keys,$args) {
if (count($keys) !== count($args)) {
// may want to handle more gracefully;
// simply returns original if numbers of keys and values
// don't match
return $ar;
}
foreach ($keys as $index=>$key) {
$ar[$key] = $args[$index];
}
return $ar;
}
$test = array(
'foo'=>1,
'bar'=>2,
'baz'=>3,
);
$newtest = assignSlice($test,array('foo','bar'),array(4,5));
編集:質問に対するOPのコメントに応じてコードを調整しました。
所属していません StackOverflow