2013-08-12 3 views
0

Я хочу сравнить два массива в php. Мои массивы выглядят так:Сравнение массивов в Php и найти значения разностей

Array ( 
[0] => Array ([Id] => 1 [row1] => 1458) 
[1] => Array ([Id] => 2 [row1] => 16) 
[2] => Array ([Id] => 3 [row1] => 115) 
[3] => Array ([Id] => 4 [row1] => 18) 
[4] => Array ([Id] => 5 [row1] => 13) 
[5] => Array ([Id] => 6 [row1] => 13) 
[6] => Array ([Id] => 7 [row1] => 131) 
) 

Array ( 
[0] => Array ([Id] => 1 [row1] => 158) 
[1] => Array ([Id] => 2 [row1] => 165) 
[2] => Array ([Id] => 3 [row1] => 111) 
[3] => Array ([Id] => 4 [row1] => 186) 
[4] => Array ([Id] => 5 [row1] => 3) 
) 

Во-первых, размеры массива 1 и размеры массива 2 не всегда равны. Значение Id в array1 может или не может присутствовать в массив2, если значение нет, то функция должна вывести общий индекс в array3, как

[someindex] => Array ([Id] => 6 [row1] => 13) 

, если он присутствует, то функция должна вычесть ROW1 из array1 в row1 из массив2 и печати в array3, как этот

[someindex] => Array ([Id] => 1 [row1] => 1300) 

и мой последний выход должен быть,

Array ( 
[0] => Array ([Id] => 1 [row1] => 1300) 
[1] => Array ([Id] => 2 [row1] => -149) 
[2] => Array ([Id] => 3 [row1] => 4) 
[3] => Array ([Id] => 4 [row1] => -168) 
[4] => Array ([Id] => 5 [row1] => 10) 
[5] => Array ([Id] => 6 [row1] => 13) 
[6] => Array ([Id] => 7 [row1] => 131) 
) 

Может ли один помочь мне в решении этой проблемы.

ответ

0

Во-первых, вы либо чтобы сделать второй массив доступным для поиска, используя значение Id в качестве клавиш или написать функцию поиска. Я выбираю первое:

$searchable = array_reduce($array2, function(&$result, $item) { 
    return $result + array($item['Id'] => $item['row1']); 
}, array()); 

array_reduce() функция начинается с пустым массивом и строит его с помощью оператора сложения массива; это создает массив, который может быть разыменован с использованием идентификатора.

Затем выполнить операцию по карте на первом массиве:

$array3 = array_map(function($item) use ($searchable) { 
    $value = isset($searchable[$item['Id']]) ? $searchable[$item['Id']] : 0; 
    $item['row1'] -= $value; 
// $item['row2'] = $item['row1'] - $value; 
    return $item; 
}, $array1); 

Выполнение операции карта сохраняет исходный массив и создает новую со значениями вы выбираете внутри функции обратного вызова.

+0

Jack Спасибо. Это что я совершенно хочу. – Sreenath

+0

Но что, если бы у меня было 10000 записей в моем массиве? требуется ли время? – Sreenath

+0

@Sreenath Мои тесты показали, что этот метод на 75% медленнее, чем мой. Среднее значение с приведенным выше = 0,145, среднее с моим = 0,083. Хотя, честно говоря, я не уверен, в каком размере пробелы действительно начинают появляться, так что это зависит от того, какие массивы размера вы используете – SmokeyPHP

0

Не знаю, если это именно то, что вы хотите, но вы можете проверить, если ключ существует с array_key_exists:

$array3 = array(); 
foreach ($array1 as $k => $v) { 
     if (array_key_exists($k, $array2)) { 
      $array3[] = $v - $array2[$k]; 
     } else { 
      $array3[] = $v; 
     } 
    } 
1
$arr1 = Array ( 
    0 => Array ('Id' => 1, 'row1' => 1458) 
    ,1 => Array ('Id' => 2, 'row1' => 16) 
    ,2 => Array ('Id' => 3, 'row1' => 115) 
    ,3 => Array ('Id' => 4, 'row1' => 18) 
    ,4 => Array ('Id' => 5, 'row1' => 13) 
    ,5 => Array ('Id' => 6, 'row1' => 13) 
    ,6 => Array ('Id' => 7, 'row1' => 131) 
); 
$arr2 = Array ( 
    0 => Array('Id' => 1, 'row1' => 158) 
    ,1 => Array('Id' => 2, 'row1' => 165) 
    ,2 => Array('Id' => 3, 'row1'=> 111) 
    ,3 => Array('Id' => 4, 'row1' => 186) 
    ,4 => Array('Id' => 5, 'row1' => 3) 
); 
$final = array(); 
foreach($arr1 as $k => $sec) 
{ 
    $sub = 0; 
    foreach($arr2 as $sec2) 
    { 
     if($sec2['Id']==$sec['Id']) 
     { 
      $sub = $sec2['row1']; 
      break; 
     } 
    } 
    $sec['row1'] -= $sub; 
    //Or to save to another element: 
    //$sec['row2'] = $sec['row1']-$sub; 
    $final[] = $sec; 
} 

echo '<pre>'.print_r($final,true).'</pre>'; 

Выход:

Array ( 
    [0] => Array ([Id] => 1 [row1] => 1300) 
    [1] => Array ([Id] => 2 [row1] => -149) 
    [2] => Array ([Id] => 3 [row1] => 4) 
    [3] => Array ([Id] => 4 [row1] => -168) 
    [4] => Array ([Id] => 5 [row1] => 10) 
    [5] => Array ([Id] => 6 [row1] => 13) 
    [6] => Array ([Id] => 7 [row1] => 131) 
) 
+0

Спасибо, он сработал. – Sreenath

+1

@Sreenath Обратите внимание, что фактическое значение Id не используется для поиска. –

+0

@Jack Я только что заметил, что вы имеете в виду - явно слишком рано для меня ... – SmokeyPHP

0

Это создает индексный массив ($new) в случае, если основные ключи не совпадают с исходными массивами.

$arr = array ( 
    0 => array ('Id' => '1','row1' => 1458), 
    1 => array ('Id' => '2','row1' => 16), 
    2 => array ('Id' => '3','row1' => 115), 
    3 => array ('Id' => '4','row1' => 18), 
    4 => array ('Id' => '5','row1' => 13), 
    5 => array ('Id' => '6','row1' => 13), 
    6 => array ('Id' => '7','row1' => 131)); 
$arr2 = array ( 
    0 => array ('Id' => '1','row1' => 158), 
    1 => array ('Id' => '2','row1' => 165), 
    2 => array ('Id' => '3','row1' => 111), 
    3 => array ('Id' => '4','row1' => 186), 
    4 => array ('Id' => '5','row1' => 3)); 
$new = array(); 
foreach ($arr2 as $key => $value){ 
    $new[$value['Id']] = $value['row1']; 
} 
foreach ($arr as $key => $value){ 
    if (isset($new[$value['Id']])){ 
     $arr[$key]['row1'] -= $new[$value['Id']]; 
    } 
} 
print_r($arr);