2009-09-11 3 views
5

Скажем, у меня есть массив пар ключ/значение в PHP:Как совместить ключи и значения массива в PHP

array('foo' => 'bar', 'baz' => 'qux'); 

Что это самый простой способ превратить это в массив, который выглядит следующим ?

array('foo=bar', 'baz=qux'); 

т.е.

array(0 => 'foo=bar', 1 => 'baz=qux'); 

В Perl'е, я сделаю что-то вроде

map { "$_=$hash{$_}" } keys %hash 

Есть ли что-то подобное в panoply of array functions в PHP? Ничто из того, что я смотрел, казалось удобным решением.

ответ

9
function parameterize_array($array) { 
    $out = array(); 
    foreach($array as $key => $value) 
     $out[] = "$key=$value"; 
    return $out; 
} 
+0

Я принимаю этот ответ, потому что это прямолинейно, и как я решил решить мою проблему. Я разочарован тем, что нет никакого способа сделать это в одном выражении, избегая необходимости в переменной временного $ out. – nohat

+3

Если вы пользователь Perl, это будет всего лишь одним из многих, многих разочарований, с которыми вы столкнетесь в ходе своего опыта работы с PHP. – chaos

+0

@chaos Да, жизнь грубая, а php читабельна. @nohat Хотя это не «преобразует» массив, как требует ваш вопрос. Это делает новый. "Panoply функций массива"? Giggle. – GZipp

0

Ответ на хаос хороший и прямой. Для более общего смысла, возможно, вы пропустили функцию array_map(), которую вы указали с помощью вашего примера map { "$_=$hash{$_}" } keys %hash.

+0

array_map(), кажется, только дает вам значения массива – nohat

+0

К сожалению, строгий эквивалентный код в PHP ниже 5.3 является 'create_function()' -using мерзостью. – chaos

+0

Ах, nohat, если вам нужны ключи, вы можете использовать вместо этого 'array_walk()' (хотя это изменяет массив на месте вместо того, чтобы возвращать новый массив). – Amber

3

А «любопытный» способ сделать это = P

// using '::' as a temporary separator, could be anything provided 
// it doesn't exist elsewhere in the array 
$test = split('::', urldecode(http_build_query($test, '', '::'))); 
+0

Я придумал одно и то же решение, но мне «любопытно»)) о процессе кодирования/декодирования, если его односемейный. Я попытался использовать его для быстрого согласования условий запроса в ORM, но почему-то сомневаюсь в безопасности данных, когда urlencode/urldecode. –

13

Другой вариант этой проблемы: На PHP 5.3+ вы можете использовать array_map() с крышкой (вы можете сделать это с помощью PHP до 5.2, но код будет довольно грязным!).

«О, но на array_map() вы получите только значение!».

Да, это правильно, но мы можем сопоставить несколько массивов! :)

$arr = array('foo' => 'bar', 'baz' => 'qux'); 
$result = array_map(function($k, $v){ 
    return "$k=$v"; 
}, array_keys($arr), array_values($arr)); 
Смежные вопросы