2017-12-14 8 views
1

連想配列のインデックス名を変更する標準のPHP関数はありますか?には、連想配列要素を別の連想配列に転送するための標準的なPHP関数があります。

$a1 = array('one'=>1,'two'=>2,'three'=>3); 
$new_index_names = array('one'=>'ono','two'=>'dos','three'=>'tres'); 

$a2 = change_index_names($a1,$new_index_names); 

print_r($a2); 

// $a2 should have the index names changed accordingly and look like this: 
// array('ono'=>1,'dos'=>2,'tres'=>3) 

EDIT 機能は、新しいインデックス名にマッピングを知る必要がありますのでご注意ください。 $ new_index_names配列の意味は、マッピングを提供します。もう一度、 'ono'が 'one'の新しいインデックス名であることを知る必要があります。

EDIT は、私はあなたたちは、独自の解決策を考え出すことができます知っている、私は思っていた、すでにこれを行い、標準のPHPの関数があります。

EDIT

インデックス名を変更することに役立つであろういくつかの状況があります。 1)あなたは、フロントエンドのコードから
あなたのバックエンドのコードを分離できるので、内部/一般名にポスト値の名前を分離します。
2)例えば、投稿から2つの配列があり、 同じ正確なプロセスを実行する必要があります。両方の配列を除いて平均/同じ正確な型が含まれています 値/順序/構造のインデックス名は異なります。したがって、 が関数名/メソッドに渡されるときには、 はその関数/メソッドに渡す前にインデックス名を変換する必要があります。

+1

内部機能を探している理由は何ですか? 'foreach($ a1 $ k => $ v)$ a2 [$ new_index_names [$ k]] = $ v;'は書くほどのコードではありません。 – jh1711

+0

ちょうどそこにコードを書き換える代わりに標準のPHP関数があるのだろうかと思います。 – dave

+0

jh1711 - 実際には、$ new_index_namesで提供されている順序やマッピングは保持されません。 – dave

答えて

0

私がこれまで見た中で最高の答え:

foreach ($a1 as $k => $v) $a2[$new_index_names[$k]] = $v; 

クレジットに行きますjh1711

2

ませんが、あなたは最初の配列の値を取得するためにarray_valuesを使用することができ、そしてarray_combineが等しい数を持って、一つの方法は、array_combine()array_values()

であります
$a2 = array_combine(array_values($new_index_names), $a1); 
1

は両方のアレイを想定すると、新しいキーを設定する

ちょうど1機能で
3

あなたがちょうど使用することができ、あなたの目的の出力を取得するにはarray_valuesを必要としない

array_combine($new_index_names,$a1);

+0

その部分を逃しました。+1 – Erwin

+0

私は 'array_combine'がassoc配列を動作させていないと思っていました。 –

+0

まれに、配列の1つがインデックスでソートされていない場合、これは[間違った結果]を生成する可能性があります(https://3v4l.org/A2LKR)。そうでなければ+1。 – jh1711

1

以前の回答 は$a1$new_index_namesの順序を考慮していないので、私は以下の私の解決策を置く:

$a1 = array('one' => 1, 'two' => 2, 'three' => 3, 'zero' => 0); 
$new_index_names = array('zero' => 'zero', 'one' => 'ono', 'two' => 'dos', 'three' => 'tres'); 

array_combine(
    $new_index_names, 
    str_replace(array_keys($a1), array_values($a1), array_keys($new_index_names)) 
); 

Array 
(
    [zero] => 0 
    [ono] => 1 
    [dos] => 2 
    [tres] => 3 
) 
+0

より良い解決策がありました。 – dave