2

2 つの連想配列があります。1 つは州 (または州) に関するデータで、もう 1 つは異なる国に関するデータです。リレーショナル データベースから値を取得しているため、states 配列には国名ではなく国 ID が保持されます。

状態配列:

array(3) {
  array {
    'name' => 'Alabama',
    'country' => 1},
  array {
    'name' => 'Alberta',
    'country' => 2},
  array {
    'name' => 'Minnesota',
    'country' => 1}
}

国配列:

array(2) {
    1 => 'United States',
    2 => 'Canada'
}

私が望む結果は次のとおりです。

array(3) {
  array {
    'name' => 'Alabama',
    'country' => 'United States'},
  array {
    'name' => 'Alberta',
    'country' => 'Canada'},
  array {
    'name' => 'Minnesota',
    'country' => 'United States'}
}

検索して検索しましたが、この特定の問題に答える質問が見つかりませんでした。このようなデータを持っているのは私だけではないと確信しています。多分私は正しい用語を探していません。これを解決するために国のモデルクラスに関数を書きましたが、もっと効率的な方法が必要だと思います。


私の現在の解決策(うまくいきますが、おそらくもっと良い方法がありますよね?):

function replaceKeyValues($replaceArray,$replaceKey)
  {
  $countries = $this->get_countries();
  foreach ($replaceArray as &$itm) {
    if (isset($itm[$replaceKey])) {
      if (in_array($itm[$replaceKey], array_flip($countries))) {
        $itm[$replaceKey] = $countries[$itm[$replaceKey]];
      }
    }
  }
  return $replaceArray;
}

//called like this (for example)
$states = $this->Country->replaceKeyValues($states,'country');

編集: Jonの提案を使用することになり、元の関数をわずかに変更して、モデルクラスでもう必要ないほど十分に汎用的にしました。これはヘルパー クラスの 1 つになり、「マスター データ」配列である別の入力パラメーターを追加しました。うまくいけば、これは誰かを助ける:-)

function replaceKeyValues($masterArray,$replaceArray,$replaceKey)
{
    foreach ($replaceArray as &$itm) {
        if (isset($itm[$replaceKey])) {
            if (isset($masterArray[$itm[$replaceKey]])) {
                $itm[$replaceKey] = $masterArray[$itm[$replaceKey]];
            }
        }
    }
    return $replaceArray;
}
4

1 に答える 1

4

これは別として、

if (in_array($itm[$replaceKey], array_flip($countries)))

次のように書く方がはるかに良いでしょう

if (isset($countries[$itm[$replaceKey]]))

ネストされた条件をネスト解除できるという事実は、これは基本的なことであり、実際に改善する機会はありません。

foreachもちろん、とラムダを置き換えることもできますが、array_walkそれは「より良い」ものではありません。

于 2013-01-26T18:03:19.763 に答える