Intereting Posts
PHP exec Java на Windows не производит вывод Как распечатать всю информацию из HTTP-запроса на экране, в PHP jquery-php magic: как открыть почтовую страницу изнутри петли на главной странице fancybox Устранение неполадок «Операция использования с не-составным именем … не влияет» Загрузка нескольких файлов в PHP и INSERT путь к MySQL PHPMailer: использование удаленного SMTP-сервера работает под локальным хостом, соединение отклонено (111) на удаленном сервере Проблема с обнаружением файлов cookie в PHP Модель слова: 2 PHP-функции, одинаковые результаты: почему? PHP url strings конфликтует «?» И «&» хранить временную строку AM PM в типе данных TIME в MySQL и получать с AM PM во время отображения? Вставка в базу данных через Android объединить 2 входных значения в URL-адрес Как отсортировать многомерный XML-файл? Переместить значение в массиве PHP в начало массива По умолчанию число десятичных мест для вывода в PHP

Массив пересекается по ключу в массиве?

У меня есть массив, в котором есть страны:

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

и у меня есть другой массив, в котором есть некоторые из ключей в нем

 array('AL', 'DZ'); 

Я хочу вызвать функцию, которая возьмет оба массива в качестве параметров и возвращает

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

Я знаю, что php имеет встроенные функции для сравнения ключей или значений, но, похоже, эти функции ожидают, что у вас есть два массива 1D или два 2D массива.

Я мог бы array_keys() для первого массива и выполнить проверку array_keys() для каждого ключа, но это кажется действительно неэффективным …

 $selection = array('AL', 'DZ'); $filtered = array_intersect_key($countries, array_flip($selection)); var_dump($filtered); 

Просто зациклируйте над 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); 

Я не думаю, что это неэффективно.

Изменить дополнение: если вы на 100% уверены, что $ Arr2 содержит только коды, которые можно найти в $ Arr1, вы можете, конечно, пропустить тест isset ().

Я думаю, это поможет. Вот функция 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)); 

Если я правильно понял, у вас есть множество стран и множество необходимых стран, и вы хотите создать массив в необходимых странах. Если это, то вы можете попробовать следующее:

 $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);