Intereting Posts
Ошибка 0x1408F10B: «SSL3_GET_RECORD: неправильный номер версии» с SDK PayPal Архитектура плагина php Отсутствие проблемы с выполнением mysqli_query Symfony 1.4: лучший способ обеспечить загрузку файла без использования шаблона / представления PHP Неустранимая ошибка: Недостаточно памяти (выделено 80740352) (попытался выделить 12352 байта) в Работа с указателями файлов на csv Как использовать обработчик сохранения Zend 2 DbTableGateway? Лучший способ отправить более 10 000 писем с PEAR / Mail_Queue Ошибка: получить свойство не-объекта FFMPEG: добавьте изображение фиксированного размера на видео, независимо от ширины и высоты видео (разрешение) Возвращение JSON из PHP в JavaScript? Поведение оператора или в PHP Столбец бит MySql возвращает странное большое число в PHP 7.1 (не в предыдущих версиях) Как найти доминантный цвет в изображении? Как закодировать php-функцию или задать параметры для возврата значений высоты NO для изображений?

Как преобразовать массив массивов или объектов в ассоциативный массив?

Я привык к функции perl map (), где callback может назначать как ключ, так и значение, создавая таким образом ассоциативный массив, в котором вход был плоским массивом. Я знаю array_fill_keys() который может быть полезен, если все, что вы хотите сделать, это создать хеш-стиль в словаре, но что, если вы не хотите, чтобы все значения были одинаковыми? Очевидно, что все может быть сделано с помощью итерации foreach, но какие существуют другие (возможно, более элегантные) методы?

Изменить : добавление примера, чтобы прояснить преобразование. Пожалуйста, не зацикливайтесь на трансформации, вопрос заключается в преобразовании плоского списка в хэш, где мы не можем предположить, что все значения будут одинаковыми.

 $original_array: ('a', 'b', 'c', 'd') $new_hash: ('a'=>'yes', 'b'=>'no', 'c'=>'yes', 'd'=>'no') *note: the values in this example are arbitrary, governed by some business logic that is not really relevant to this question. For example, perhaps it's based on the even-oddness of the ordinal value of the key 

Пример реального мира Итак, используя ответ, который был приведен здесь, вот как вы могли бы проанализировать через $ _POST, чтобы получить список только тех полей ввода, которые соответствуют заданным критериям. Это может быть полезно, например, если у вас много полей ввода в вашей форме, но определенная группа из них должна обрабатываться вместе.

В этом случае у меня есть ряд полей ввода, которые представляют сопоставления в базу данных. Каждое из полей ввода выглядит следующим образом: <input name="field-user_email" value="2" /> где каждый из этого типа поля имеет префикс «field-».

то, что мы хотим сделать, это, во-первых, получить список только тех полей ввода, которые фактически начинаются с «field-», тогда мы хотим создать ассоциативный массив с именем $mapped_fields который имеет извлеченное имя поля в качестве ключа и фактического ввода значение поля в качестве значения.

 $mapped_fields = array_reduce( preg_grep( '/field-.+/', array_keys( $_POST ) ), function( $hash, $field ){ $hash[substr( $field, 6 )] = $_POST[$field]; return $hash; } ); 

Какие результаты:

 Array ( [date_of_birth] => 1 [user_email] => 2 [last_name] => 3 [first_name] => 4 [current_position] => 6 ) 

(Итак, чтобы предупредить скептиков, позвольте мне согласиться, что этот бит компактного кода, возможно, намного менее читабельен, что простой цикл, который выполняет итерацию через $ _POST, и для каждого ключа проверяет, имеет ли он префикс, и если поэтому, выдает его и его значение на массив)

Solutions Collecting From Web of "Как преобразовать массив массивов или объектов в ассоциативный массив?"

Несколько дней назад у меня была такая же проблема. Это невозможно с помощью array_map , но array_reduce делает трюк.

 $arr = array('a','b','c','d'); $assoc_arr = array_reduce($arr, function ($result, $item) { $result[$item] = (($item == 'a') || ($item == 'c')) ? 'yes' : 'no'; return $result; }, array()); var_dump($assoc_arr); 

результат:

array(4) { ["a"]=> string(3) "yes" ["b"]=> string(2) "no" ["c"]=> string(3) "yes" ["d"]=> string(2) "no" }

Насколько я знаю, это невозможно в одном выражении, поэтому вы можете использовать цикл foreach , à la

 $new_hash = array(); foreach($original_array as $item) { $new_hash[$item] = 'something'; } 

Если вам нужно это в одном выражении, продолжайте и выполните функцию:

 function array_map_keys($callback, $array) { $result = array(); foreach($array as $item) { $r = $callback($item); $result[$r[0]] = $r[1]; } return $result; } 

Это пояснение к моему комментарию в принятом методе. Надеюсь, читать легче. Это из класса WordPress, поэтому ссылка $ wpdb для записи данных:

 class SLPlus_Locations { private $dbFields = array('name','address','city'); public function MakePersistent() { global $wpdb; $dataArray = array_reduce($this->dbFields,array($this,'mapPropertyToField')); $wpdb->insert('wp_store_locator',$dataArray); } private function mapPropertyToField($result,$property) { $result[$property] = $this->$property; return $result; } } 

Очевидно, что для полного решения есть немного больше, но присутствуют элементы, относящиеся к array_reduce (). Легче читать и более элегантно, чем foreach или заставлять проблему с помощью array_map () плюс пользовательский оператор insert.

Ницца!