2012-01-23 4 views
0

Это то, что я пытаюсь достичь:array_merge и array_map

array (
    'category_0' => 
    array (
    'count' => 12, 
    'avg' => 11, 
), 
    'category_1' => 
    array (
    'count' => 14, 
    'avg' => 13, 
), 
    'category_2' => 
    array (
    'count' => 16, 
    'avg' => 15, 
), 
    'category_3' => 
    array (
    'count' => 18, 
    'avg' => 17, 
), 
) 

из следующего:

$category = 
array (
    0 => '9', 
    1 => '10', 
    2 => '11', 
    3 => '12', 
) 

и:

$count = 
array (
    0 => '12', 
    1 => '14', 
    2 => '16', 
    3 => '18', 
) 

и:

$avg = 
array (
    0 => '11', 
    1 => '13', 
    2 => '15', 
    3 => '17', 
) 

Я пришел к переменным и $avg, выполнив некоторые другие методы, используя foreach на $category и функцию array_map. Теперь мне нужно воссоединиться с каждым из примеров. Я пробовал array_merge(), но не смог заставить его работать правильно. Ключевое имя «category_x» не имеет значения. Я даже не уверен, что можно получить окончательный результат в том порядке, в котором я нуждаюсь. Любая помощь будет оценена по достоинству.

ответ

2

Используя комбинацию array_keys и петлю foreach, вы можете легко выполнить это.

Пример:

<?php 

$category = array (
    0 => '9', 
    1 => '10', 
    2 => '11', 
    3 => '12' 
); 
$count = array (
    0 => '12', 
    1 => '14', 
    2 => '16', 
    3 => '18' 
); 
$avg = array (
    0 => '11', 
    1 => '13', 
    2 => '15', 
    3 => '17' 
); 

$out = array(); 
$key = array_keys($category); 
foreach ($key as $key) { 
    $out["category_{$key}"] = array(
     'count' => isset($count[$key]) ? $count[$key] : 0, 
     'avg' => isset($avg[$key]) ? $avg[$key] : 0 
    ); 
} 
print_r($out); 

Выход:

Array 
(
    [category_0] => Array 
     (
      [count] => 12 
      [avg] => 11 
     ) 

    [category_1] => Array 
     (
      [count] => 14 
      [avg] => 13 
     ) 

    [category_2] => Array 
     (
      [count] => 16 
      [avg] => 15 
     ) 

    [category_3] => Array 
     (
      [count] => 18 
      [avg] => 17 
     ) 

) 
+0

Вы, сэр, явно гений с массивами. Я, очевидно, нет. Огромное спасибо. – Patrick

+0

Добро пожаловать. :) –

1

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

<?php 
$category = array (
    0 => '9', 
    1 => '10', 
    2 => '11', 
    3 => '12' 
); 


$count = array (
    0 => '12', 
    1 => '14', 
    2 => '16', 
    3 => '18' 
); 

$avg = array (
    0 => '11', 
    1 => '13', 
    2 => '15', 
    3 => '17' 
); 

$final_array = array(); 
for($i=0;$i<count($category);$i++){ 
    $final_array['category_'.$i] = array(
     'count' => $count[$i], 
     'avg' => $avg[i] 
    ); 
} 

print_r($final_array); 

?> 

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

1

Нет никакого способа сделать что-либо подобное с вызовом функции, вам нужно будет выполнить цикл вручную. Если это может вызвать проблему из-за количества записей, вы можете подумать и рефакторировать.

$res = array(); 

// category values are irrelevant, but it is easier than using array_keys 
// (and never use for loops when you can use foreach: foreach can be 20% faster 
foreach($category as $key=>$val) 
{ 
    // use manual concatenation and it is generally about 1.5% faster 
    // and clearer to your compatriots 
    $res['Category_'.$key] = array(
      // since key maps to the same key for all, then simply use that 
      // for the lookup 
      /* 
      if you KNOW that there will always be a key in $count and $avg 
      then use the following: 
      */ 
      'count' => $count[$key], 
      'avg' => $avg[$key] 
      /* 
      otherwise you will need to use this: 
      'count' => isset($count[$key])?$count[$key]:0, 
      'avg' => isset($avg[$key])?$avg[$key]:0 
      */ 
    ); 
} 
// $res now has everything you're looking for. 
Смежные вопросы