7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【メモ】配列のキーを変更したいけど…

Posted at

なんだか簡単に変更できない。
ドキュメントを見てもそれらしい関数が無い?
有用ではないのでメモとして。

#結論
関数作ってみたけど…

  • 車輪の再発明感がすごい。
  • 一つ一つ手動で入れればいいじゃん。そんなに楽にならないよ。
  • そもそも受け手でキーを変更するなら最初から必要な名前にしなさい(サフィックス・プレフィックスはまだ使いドコロがあるかも…)
  • 数値添字とか考慮してない

結局ほぼ使わなかったので動作検証とかはないです。

#出来ないこと

foreach ($array as &$key => $value) {
    $key .= 'hoge';
}

はキーにリファレンス使えないと怒られる。

array_walkとかは構造を変更できないらしい。

変更される可能性があるのは配列の値だけであり、 その構造を変更することはできません。つまり、 プログラマは要素の追加や削除そして並べ替えなどができないということです。 コールバック関数がこの条件を満たさない場合は、 この関数の動作は未定義で予期せぬ結果を得ることになります。

#作ったもの

もやもやするけど作る

キーにサフィックスをつける関数
function array_key_suffix(array $array, $suffix = '')
{
    $result = array();
    foreach ($array as $key => $value) {
        $result[$key . $suffix] = $value;
    }
    return $result;
}

作るという程のものでもないが。
$result[$suffix . $key]にすればプレフィックス
関数にしなければ直接$arrayに入れていいが、代わりにunset($array[$key])が必要。

###任意のキーを付けるなら

array_combine?
でも配列の数と順番が一致しないといけない。
やはり変更前後の表を作って変換するしかないが、存在チェックもしなければいけない

array_key_change(array $map, array $array)
{
    $result = array();
    foreach($map as $before => $after) {
        if(array_key_exists($before, $array)) {
            $result[$after] = $array[$before];
        }
    }
    return $result;
}

$beforeが無ければ$afterが生まれない。nullを入れておく

function array_key_change(array $map, array $array)
{
    $result = array();
    foreach($map as $before => $after) {
        if(array_key_exists($before, $array)) {
            $result[$after] = $array[$before];
        } else {
            $result[$after] = null;
        }
    }
    return $result;
}

じゃあ三項演算子でいいのか。

function array_key_change(array $map, array $array)
{
    $result = array();
    foreach($map as $before => $after) {
        $result[$after] = array_key_exists($before, $array) ? $array[$before] : null;
    }
    return $result;
}

キーがないならキーごとのデフォルト値を入れたい場合は…?

function array_key_change(array $map, array $array, array $default)
{
    $result = array();
    foreach($map as $before => $after) {
        $result[$after] = array_key_exists($before, $array) ? $array[$before] : $default[$before];
    }
    return $result;
}

んーこれだとキーが定義されて値がnullだとnullが入るはず。この場合はisset()のほうがいいのかな…

そもそも期待するキーが無ければ無いままでいいのかもしれない。
あと配列内のキーの付け替え(値交換)にも使えそう。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?