Как получить разницу между ассоциированными массивами в Stack Overflow

У меня есть такие массивы

Array
(
[original_data] => Array
(
[0] => Array
(
[reference_id] => 122
[id] => 121
[reference_name] => Dinesh
)

[1] => Array
(
[reference_id] => 123
[id] => 120
[reference_name] => Dinesh Test
)

)

[edited_data] => Array
(
[0] => Array
(
[reference_id] => 123
[id] => 120
[reference_name] => Dinesh Test2
)

)

)

Я хочу получить разницу между этим original_data а также edited_data массивы. Как это сделать? Я пытался с помощью array_diff, Но, это не сработало правильно.

1

Решение

Вы можете получить разницу =>

$result = ref_array_diff($requestedData['edited_data'], $requestedData['data']);

print_r($result);

function ref_array_diff($arraya, $arrayb) {
foreach ($arraya as $keya => $valuea) {
if (in_array($valuea, $arrayb)) {
unset($arraya[$keya]);
}
}
return $arraya;
}
1

Другие решения

Если вы используете array_map как для исходных, так и для отредактированных данных, чтобы получить массив значений идентификатора original_data и значений идентификатора edited_data. Затем вы можете использовать array_diff без проблем. Используя результирующий список идентификаторов, которые находятся в одном, но не в другом, вы можете найти исходное значение, используя индексный ключ сопоставленных значений массива в исходных массивах.

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

0

Это должно работать.

<?php

// your data
$data = array (
'original_data' => array
('0' => array
(
'reference_id' => 122,
'id' => 121,
'reference_name' => 'Balasuresh,'
),

'1' => array
(
'reference_id' => 123,
'id' => 120,
'reference_name' => 'Balasuresh',
),
),

'edited_data' => array
('0' => array
(
'reference_id' => 123,
'id' => 120,
'reference_name' => 'Balasuresh Test',
),
)

) ;


// let's get our reference_ids
$originalData = array() ;
foreach($data['original_data'] as $entry) {
$originalData[$entry['reference_id']] = $entry ;
}

// let's compare our edited data to our original data
$editedData = array() ;
foreach($data['edited_data'] as $editedEntry) {
if (isset($originalData[$editedEntry['reference_id']])) {
// for readability
$compare = $originalData[$editedEntry['reference_id']] ;
foreach($editedEntry as $key=>$value) {
if ($compare[$key] != $value) {
$editedData[$editedEntry['reference_id']][$key] = $value ;
}
}
}
}

$editedData теперь содержит ваши различия

0

Это многомерные ассоциативные массивы, вы можете рекурсивно выполнить array_diff_assoc следующим образом:
Вы можете проверить этот код здесь https://3v4l.org/ovaQB:

function array_diff_assoc_recursive($array1, $array2)
{
foreach($array1 as $key => $value)
{
if(is_array($value))
{
if(!isset($array2[$key]))
{
$difference[$key] = $value;
}
elseif(!is_array($array2[$key]))
{
$difference[$key] = $value;
}
else
{
$new_diff = array_diff_assoc_recursive($value, $array2[$key]);
if($new_diff != FALSE)
{
$difference[$key] = $new_diff;
}
}
}
elseif(!isset($array2[$key]) || $array2[$key] != $value)
{
$difference[$key] = $value;
}
}
return !isset($difference) ? 0 : $difference;
}

$a=["original_data"=>[
[
'reference_id' => 122,
'id' => 121,
'reference_name' => 'Balasuresh'
],[
'reference_id' => 123,
'id' => 120,
'reference_name' => 'Balasuresh'
]

],

'edited_data' => [[
'reference_id' => 123,
'id' => 120,
'reference_name' => 'Balasuresh Test'
]]

];

print_r(array_diff_assoc_recursive($a['edited_data'], $a['original_data']));

выход:

Array
(
[0] => Array
(
[reference_id] => 123
[id] => 120
[reference_name] => Balasuresh Test
)

)
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector