20

国のある配列があります。

array(
'AF'=>'AFGHANISTAN',
'AL'=>'ALBANIA',
'DZ'=>'ALGERIA',
'AS'=>'AMERICAN SAMOA',
);

いくつかのキーを含む別の配列があります

array('AL', 'DZ');

両方の配列をパラメーターとして受け取り、戻り値を返す関数を呼び出したい

array(
'AL'=>'ALBANIA',
'DZ'=>'ALGERIA',
);

phpにはキーや値を比較する関数が組み込まれていることは知っていますが、これらの関数はすべて、2つの1D配列または2つの2D配列を想定しているようです。

array_keys()最初の配列をループしin_array()て各キーをチェックすることもできますが、それは本当に非効率的なようです...

4

4 に答える 4

45
$selection = array('AL', 'DZ');
$filtered = array_intersect_key($countries, array_flip($selection));
var_dump($filtered);
于 2012-07-25T07:16:57.543 に答える
4

SECOND 配列をループして、最初の配列から値をフェッチするだけです。逆もまた同様で、実際には不必要に非効率的です。

そう:

$Arr1 = array(
'AF'=>'AFGHANISTAN',
'AL'=>'ALBANIA',
'DZ'=>'ALGERIA',
'AS'=>'AMERICAN SAMOA',
);

$Arr2 = array('AL', 'DZ');

$result = array();
foreach ($Arr2 as $cc){
  if (isset($Arr1[$cc])){
    $result[$cc] = $Arr1[$cc];
  }
}
print_r($result);

非効率だとは思いません。

編集の追加: $Arr2 に $Arr1 で検出できるコードのみが含まれていることを 100% 確信している場合は、もちろん isset() テストをスキップできます。

于 2012-07-25T07:13:45.250 に答える
-1

これが役立つと思います。これは、期待どおりに機能する関数 key_values_intersect です:)

$longcodes = array(
    'AF' => 'AFGHANISTAN',
    'AL' => 'ALBANIA',
    'DZ' => 'ALGERIA',
    'AS' => 'AMERICAN SAMOA',
);

$code = array('AL', 'DZ');

function key_values_intersect($haystack, $needle)
{
    $tmp=array();
    foreach ($needle AS $key) {
        $tmp[$key] = $haystack[$key];
    }
    return $tmp;
}


print_r(key_values_intersect($longcodes,$code));
于 2012-07-25T07:40:16.597 に答える
-2

私が正しく理解していれば、国の配列と必要な国の配列があり、必要な国の配列を作成したいと考えています。その場合は、これを試すことができます:

$countries = array ("AF"=>"AFGJANISTAN", "AL"=>"ALBANIA", "LV"=>"LATVIA", "USA"=>"UNITED STATES OF AMERICA");
$needed  = array ("AF", "AL");

$result = array ();
foreach ($needed as $row) {
   if (in_array($row, $contries)) {
       $result[] = $countries[$row];
   }
}
var_dump($result);
于 2012-07-25T07:08:14.267 に答える