2012-01-31 3 views
3

У меня есть два массива:PHP - слияние двух массивов, подобные array_combine, но с ключами дублирующих

$arrKeys = array('str', 'str', 'otherStr'); 
$arrVals = array('1.22', '1.99', '5.17'); 

Я хотел бы объединить их в нечто вроде этого

$arrResult = array(
    array('str' => 1.22), 
    array('str' => 1.99), 
    array('otherStr' => 5.17) 
); 

Ключи являются не- уникальный, иначе я бы использовал array_combine. Это даст немного другой результат, но мне это тоже понравится.

Можно ли это сделать элегантным способом с использованием PHP 5.2.x, без foreach/for циклов, предпочтительно используя встроенные функции PHP?

+0

У вас не может быть уникальных ключей в массиве php. – chelmertz

+0

@chelmertz - да, поэтому я не использую array_combine, и результат, который я хотел бы получить, немного отличается, как в моем примере – bububaba

ответ

11

Вы можете использовать array_map:

$arrKeys = array('str', 'str', 'otherStr'); 
$arrVals = array('1.22', '1.99', '5.17'); 
function foo($key, $val) { 
    return array($key=>$val); 
} 

$arrResult = array_map('foo', $arrKeys, $arrVals); 

print_r($arrResult); 
Array 
(
    [0] => Array 
     (
      [str] => 1.22 
     ) 

    [1] => Array 
     (
      [str] => 1.99 
     ) 

    [2] => Array 
     (
      [otherStr] => 5.17 
     ) 

) 

BTW, если перейти на PHP 5.3 вы можете сделать это, используя анонимную функцию, которая является немного более элегантным:

array_map(function($key, $val) {return array($key=>$val);}, $arrKeys, $arrVals); 
+0

Интересно, почему кто-то проголосовал бы за это после его принятия без добавления комментария –

2

Предполагая, что вы хотите item 0 в $arrKeys и элемент 0 в $arrVals, который будет добавлен к одному массиву, и этот массив будет элементом в $arrResult и т. д., самым простым способом, вероятно, будет простой цикл:

$arrResult = array(); 
for ($i = 0, $max = count($arrKeys); $i < $max; $i++) { 
    $arrResult[] = array($arrKeys[$i], $arrValues[$i]); 
} 
+0

Эй, Дейв, я слышал, что ты эксперт. –

+0

Я бы не сказал, что я эксперт. Но напомните мне сказать спасибо тому, кто сказал, что я был! :) –

8

Нет абсолютно «элегантного» в использовании встроенных функций PHP и нечего делать.

Это не Haute Couture показать. Это программирование.
До тех пор, пока у вас есть решение, разумное, читаемое и работающее, вы можете назвать его элегантным.

Простой foreach выполнит эту работу. Вы сделали бы огромную пользу и сэкономили бы много времени, если бы начали использовать рабочие решения вместо поиска «элегантных».

$result = array(); 
foreach ($arrKeys as $i => $key) { 
    $result[] = array($key => $arrVals[$i]); 
} 
+3

Не является ли 'array_map' простым * и * элегантным? –

+2

нет. obfuscating ваш собственный код не имеет ничего общего с элегантностью. –

+0

У меня нет проблем с чтением 'array_map', но на самом деле здесь я думаю, что просто простой цикл является более понятным для следующего парня. – Wrikken

Смежные вопросы