19

私は以下のような配列を持っています

$old = array(
       'a' => 'blah',
       'b' => 'key',
       'c' => 'amazing',
       'd' => array(
                0 => 'want to replace',
                1 => 'yes I want to'
              )
       );

キー情報に置き換えるキーを持つ別の配列があります。

$keyReplaceInfoz = array('a' => 'newA', 'b' => 'newB', 'c' => 'newC', 'd' => 'newD');

$old配列のすべてのキーを配列内のそれぞれの値に置き換える必要があります$keyReplaceInfo

出力は次のようになります

$old = array(
       'newA' => 'blah',
       'newB' => 'key',
       'newC' => 'amazing',
       'newD' => array(
                0 => 'want to replace',
                1 => 'yes I want to'
              )
       );

私は以下のように手動でそれをしなければなりませんでした。私はより良いオプションを期待しています。誰かがこれを達成するためのより良い方法を提案できますか?

$new = array();
foreach ($old as $key => $value)
{
     $new[$keyReplaceInfoz[$key]] = $value;
}

私はこれがもっと簡単になることを知っています。

4

12 に答える 12

29
array_combine(array_merge($old, $keyReplaceInfoz), $old)

これはあなたが提起したものよりも簡単に見えると思います。

于 2012-07-30T14:08:44.083 に答える
5
array_combine(
    ['newKey1', 'newKey2', 'newKey3'],
    array_values(['oldKey1' => 1, 'oldKey2' => 2, 'oldKey3' => 3])
);

同じ数の値と同じ順序がある限り、これでうまくいくはずです。

于 2018-07-25T15:58:49.483 に答える
3

array_combine、array_merge、さらにはarray_intersect_keyを使用するIMOはやり過ぎです。元のコードは十分に優れており、非常に高速です。

于 2020-03-11T10:25:53.540 に答える
2

@ shawn-kソリューションを適応させて、array_walkを使用したよりクリーンなコードを示します。これは、必要なキーのみを置き換えます。もちろん、都合に合わせて変更できます。

array_walk($old, function($value,$key)use ($keyReplaceInfoz,&$old){
        $newkey = array_key_exists($key,$keyReplaceInfoz)?$keyReplaceInfoz[$key]:false;
        if($newkey!==false){$old[$newkey] = $value;unset($old[$key]);
        }
    });

    print_r($old);
于 2016-03-17T05:41:14.777 に答える
1

私は自分のアプリケーションでこれと同じ問題を解決しましたが、私のアプリケーションでは$ keyReplaceInfozがホワイトリストのように機能します-キーが見つからない場合、その要素全体が結果の配列から削除され、一致するホワイトリストに登録されたキーが新しい値に変換されます。

array_map(http://php.net/manual/en/function.array-map.php)を巧みに使用することで、この同じアルゴリズムをより少ないコードで適用できると思います。これはおそらく別の寛大な読者が行うでしょう。

function filterOldToAllowedNew($key_to_test){       
    return isset($keyReplaceInfoz[$key_to_test])?$keyReplaceInfoz[$key_to_test]:false;
}   

$newArray = array();

foreach($old as $key => $value){
    $newkey = filterOldToAllowedNew($key);
    if($newkey){
       $newArray[$newkey] = $value;
    }
}

print_r($newArray);
于 2015-04-24T07:00:08.477 に答える
0

これは私が同じ主題のために実装した解決策です:

/**
 * Replace keys of given array by values of $keys
 * $keys format is [$oldKey=>$newKey]
 *
 * With $filter==true, will remove elements with key not in $keys
 *
 * @param  array   $array
 * @param  array   $keys
 * @param  boolean $filter
 *
 * @return $array
 */
function array_replace_keys(array $array,array $keys,$filter=false)
{
    $newArray=[];
    foreach($array as $key=>$value)
    {
        if(isset($keys[$key]))
        {
            $newArray[$keys[$key]]=$value;
        }
        elseif(!$filter)
        {
            $newArray[$key]=$value;
        }
    }

    return $newArray;
}
于 2017-07-01T20:45:25.583 に答える
0

この質問は古いですが、Googleで最初に出てくるので、解決策を追加したいと思いました。

// Subject
$old = array('foo' => 1, 'baz' => 2, 'bar' => 3));

// Translations    
$tr  = array('foo'=>'FOO', 'bar'=>'BAR');

// Get result
$new = array_combine(preg_replace(array_map(function($s){return "/^$s$/";}, 
           array_keys($tr)),$tr, array_keys($old)), $old);

// Output
print_r($new);

結果:

    
    配列
    ((
       [FOO] => 1
       [バズ]=>2
       [BAR] => 3
    )。
于 2018-10-13T22:59:49.527 に答える
0

これは、配列の順序と配列の数に関係なく機能します。出力の順序と値は、replaceKeyに基づきます。

$replaceKey = array('a' => 'newA', 'b' => 'newB', 'c' => 'newC', 'd' => 'newD', 'e' => 'newE','f'=>'newF');

$array = array(
       'a' => 'blah',
       'd' => array(
                0 => 'want to replace',
                1 => 'yes I want to'
              ),
       'noKey'=>'RESIDUAL',
       'c' => 'amazing',
       'b' => 'key',
       );

$filterKey = array_intersect_key($replaceKey,$array);
$filterarray = array_intersect_key(array_merge($filterKey,$array),$filterKey);

$replaced = array_combine($filterKey,$filterarray);

//output
var_export($replaced);
//array ( 'newA' => 'blah', 'newB' => 'key', 'newC' => 'amazing', 'newD' => array ( 0 => 'want to replace', 1 => 'yes I want to' ) )
于 2019-06-13T05:22:04.443 に答える
0

多次元配列で使用する再帰的なソリューションを探している場合は、以下の方法を参照してください。要求されたすべてのキーを置き換え、他のすべてのキーはそのままにします。

/**
 * Given an array and a set of `old => new` keys,
 * will recursively replace all array keys that
 * are old with their corresponding new value.
 *
 * @param mixed $array
 * @param array $old_to_new_keys
 *
 * @return array
 */
function array_replace_keys($array, array $old_to_new_keys)
{
    if(!is_array($array)){
        return $array;
    }

    $temp_array = [];
    $ak = array_keys($old_to_new_keys);
    $av = array_values($old_to_new_keys);

    foreach($array as $key => $value){
        if(array_search($key, $ak, true) !== false){
            $key = $av[array_search($key, $ak)];
        }

        if(is_array($value)){
            $value = array_replace_keys($value, $old_to_new_keys);
        }

        $temp_array[$key] = $value;
    }

    return $temp_array;
}

OPのサンプル配列の使用:

$old = array(
       'a' => 'blah',
       'b' => 'key',
       'c' => 'amazing',
       'd' => array(
                0 => 'want to replace',
                1 => 'yes I want to'
              )
       );
$replace = ["a" => "AA", 1 => 11];

var_export(array_replace_keys($old, $replace));

次の出力が得られます。

array (
  'AA' => 'blah',
  'b' => 'key',
  'c' => 'amazing',
  'd' => 
  array (
    0 => 'want to replace',
    11 => 'yes I want to',
  ),
)

デモ

次のスニペットに触発されました。

于 2021-03-04T06:36:24.513 に答える
0

これは@Summonerを使用していますが、@ Leighヒントを念頭に置いています。

$start = microtime();
$array = [ "a" => 1, "b" => 2, "c" => 3 ];

function array_replace_key($array, $oldKey, $newKey) {
    $keys = array_keys($array);
    $idx = array_search($oldKey, $keys);
    array_splice($keys, $idx, 1, $newKey);
    return array_combine($keys, array_values($array));
}

print_r(array_replace_key($array, "b", "z"));
于 2021-03-23T15:32:39.623 に答える
-1
    <?php
$new = array(); 

foreach ($old as $key => $value)
{
     $new[$keyReplaceInfoz][$key] = $value;

}
?>
于 2012-07-30T14:07:57.670 に答える
-1
<?php
$old = array(
       'a' => 'blah',
       'b' => 'key',
       'c' => 'amazing',
       'd' => array(
                0 => 'want to replace',
                1 => 'yes I want to'
              )
       );
$keyReplaceInfoz = array('a' => 'newA', 'b' => 'newB', 'c' => 'newC', 'd' => 'newD');

$new = array(); 

foreach ($old as $key => $value)
{
    $newvalue =  $keyReplaceInfoz[$key];
   $new[$key] = $newvalue;
}
print_r($new);

?>
于 2012-07-30T14:24:45.387 に答える