2011-02-02 3 views
0

У меня есть два двумерных массива (на самом деле они вложенные ассоциативные массивы) с предопределенным строением: $array1 и $array2. Первый массив содержит список всех объектов по их номерам ID:Объединить двумерные массивы в PHP

$array1 = array(
    array(id => 1), 
    array(id => 2), 
    array(id => 3), 
    array(id => 4), 
    array(id => 5) 
); 

Второй массив перечислены отношения между объектами (например, объект 2 подключен к объектам 3, 4 и 5):

$array2 = array(
    array(id1 => 1, id2 => 2), 
    array(id1 => 2, id2 => 3), 
    array(id1 => 2, id2 => 4), 
    array(id1 => 2, id2 => 5) 
); 

целью заключается в замене значений id из $array2 соответствующими индексами от $array1. Итак, в моем случае результат должен быть:

0 1 // index of value 1 (id1) in $array1 is 0, index of 2 (id2) is 1 
1 2 
1 3 
1 4 

Вложенный ниже мой текущий труд. Прежде всего, я «преобразовать» $array1 в один одномерный массив:

foreach ($array1 as $row) { 
    $array3[] = $row['id']; 
} 

Затем я использую array_search функцию и пройти через $array2 и поиск $array3 для заданного значения и возвращает соответствующий ключ в $array3:

foreach ($array2 as $row) { 
    $value1 = $row['id1']; 
    $key1 = array_search($value1, $array3); 
    echo $key1; 
    echo "\t"; 
    $value2 = $row['id2']; 
    $key2 = array_search($value2, $array3); 
    echo $key2; 
    echo '<br />'; 
} 

Мой вопрос прост: существует ли более элегантный способ сделать это (т. Е. Без использования функции array_search).

Большое спасибо за любые идеи.

Бест, Андрей

ответ

1

Вы можете использовать ассоциативный массив, который связывает значение индекса.

foreach ($array1 as $index => $row) { 
    $array3[$row['id']] = $index; 
} 

Тогда вы можете

$key1 = $array3[$value1]; 

и

$key2 = $array3[$value2]; 
+0

Спасибо, работает как Шарм. – Andrej

1

, если каждая строка в $array1 имеют уникальный идентификатор, вы можете перевернуть $array3

<?php 
$array3 = array(); 
foreach ($array1 as $k => $v) { 
    $array3[$v['id']] = $k; 
} 
foreach ($array2 as $row) { 
    list($id1, $id2) = $row; 
    printf("%s\t%s<br />", $array3[$id1], $array3[$id2]); 
} 
+0

Thanks; хорошие решения, использующие функцию списка во втором цикле. – Andrej

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