2012-01-12 2 views
0
$items = array(
    array(
     'id' => 0, 
     'name' => 'Simple Sword', 
     'type' => 'weapon', 
     'price' => 200, 
     'value1' => 5, 
     'value2' => 10, 
     'value3' => 0, 
     'value4' => 0, 
     'value5' => 0 
    ), 
    array(
     'id' => 1, 
     'name' => 'Iron Sword', 
     'type' => 'weapon', 
     'price' => 500, 
     'value1' => 0, 
     'value2' => 0, 
     'value3' => 0, 
     'value4' => 0, 
     'value5' => 0 
    ) 
); 


$inventory = array(

    array(
     'item' => 0, 
     'slot' => 1, 
     'value1' => 0, 
     'value2' => 0, 
     'value3' => 0, 
     'value4' => 0, 
     'value5' => 0, 
     'equipped' => 0 
    ), 

    array(
     'item' => 1, 
     'slot' => 2, 
     'value1' => 0, 
     'value2' => 0, 
     'value3' => 0, 
     'value4' => 0, 
     'value5' => 0, 
     'equipped' => 1 
    ) 

); 

Что мне нужно, чтобы соединить эти 2 многомерные массивы, или принимать значения, ключи и т.д. из массива «Элементы» и поместить его в массив Inventory, где «элемент» идентификатор соответствует идентификатору из массива Items. Совместим с оператором INNER JOIN в SQL. Как? Я не могу понять.Регистрация 2 многомерный массив

Во-вторых, я пытаюсь напечатать массив $ инвентаризации, я попытался следующие, но это не сработало:

foreach ($inventory as $a) { 

    foreach ($a as $b) { 

     echo $b['item']; 

    } 

} 

Это не дает мне выход.

ответ

1
foreach($inventory as $key=>$val) 
{ 
    if($val['item'] == $items[$key]['id']) 
    { 
     $newarr[] = array_merge($items[$key],$val); 
    } 
} 

проверка $newarr[] использованием print_r($newarr), здесь выход:

Array 
(
    [0] => Array 
     (
      [id] => 0 
      [name] => Simple Sword 
      [type] => weapon 
      [price] => 200 
      [value1] => 0 
      [value2] => 0 
      [value3] => 0 
      [value4] => 0 
      [value5] => 0 
      [item] => 0 
      [slot] => 1 
      [equipped] => 0 
     ) 

    [1] => Array 
     (
      [id] => 1 
      [name] => Iron Sword 
      [type] => weapon 
      [price] => 500 
      [value1] => 0 
      [value2] => 0 
      [value3] => 0 
      [value4] => 0 
      [value5] => 0 
      [item] => 1 
      [slot] => 2 
      [equipped] => 1 
     ) 

) 

Второй вопрос, чтобы распечатать $inventory массива:

foreach ($inventory as $a) 
{ 
    echo $a['item']; 
    echo $a['slot']; 
    echo $a['value1']; 
    //...etc 
} 
1

немного помочь с вашей второй проблемой:

foreach ($inventory as $a => $b) { 
     echo $b['item']; 
    } 
} 
1

Что касается первого вопроса, то Zulkhaery Basrul дал хороший ответ. Я хотел бы также рассмотреть вопрос о создании break заявления, если отношение один-к-одному:

if($val['item'] == $items[$key]['id']) { 
    $newarr[] = array_merge($items[$key],$val); 
    break; 
} 

Что касается второго вопроса:

foreach ($inventory as $invKey => $aInventoryItem) { 
    echo $aInventoryItem['item'] . "\n"; 
} 
1

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

foreach($inventory as $inv) { 
     echo $inv['item']; 
    } 
0

Я считаю, что эта функция является то, что вы ищете :

// Join Arrays on Keys 
function array_join($original, $merge, $on) { 
    if (!is_array($on)) $on = array($on); 
    foreach ($merge as $right) { 
     foreach ($original as $index => $left) { 
      foreach ($on as $from_key => $to_key) { 
       if (!isset($original[$index][$from_key]) 
        || !isset($right[$to_key]) 
        || $original[$index][$from_key] != $right[$to_key]) 
        continue 2; 
      } 
      $original[$index] = array_merge($left, $right); 
     } 
    } 
    return $original; 
} 

Использование для сценария:

print_r(array_join($items, $inventory, array('id' => 'item'))); 

Я попросил помощи у сообщества с оптимизируя LEFT JOIN версия функции здесь (только различия $removeunset и array_merge): How can I optimize my array_join (simulates a LEFT JOIN) function?

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