я хотел бы попросить вас о помощи, так как мне трудно решить этот вопрос. Я создал функцию, облегчающую diff, но этого недостаточно для моих нужд. Спасибо и больше силы!
<?php $arraySession = array( 'sampleA' => array('1', '2', '3'), 'sampleB' => array('1', '2', '3'), ); $arrayPost = array( 'sampleA' => array('1'), 'sampleB' => array('1','2'), );
результатом должно быть:
array( 'sampleA' => array('2', '3') 'sampleB' => array('3'), )
моя существующая функция:
public function array_diff_multidimensional($session, $post) { $result = array(); foreach($session as $sKey => $sValue){ foreach($post as $pKey => $pValue) { if((string) $sKey == (string) $pKey) { $result[$sKey] = array_diff($sValue, $pValue); } else { $result[$sKey] = $sValue; } } } return $result; }
Любая помощь приветствуется! Счастливое кодирование!
Не моя функция и не проверена мной, но это был один из первых комментариев на php.net/array_diff (кредит отправляется в frox в gmail dot com)
<?php function multidimensional_array_diff($a1, $a2) { $r = array(); foreach ($a2 as $key => $second) { foreach ($a1 as $key => $first) { if (isset($a2[$key])) { foreach ($first as $first_value) { foreach ($second as $second_value) { if ($first_value == $second_value) { $true = true; break; } } if (!isset($true)) { $r[$key][] = $first_value; } unset($true); } } else { $r[$key] = $first; } } } return $r; } ?>
с<?php function multidimensional_array_diff($a1, $a2) { $r = array(); foreach ($a2 as $key => $second) { foreach ($a1 as $key => $first) { if (isset($a2[$key])) { foreach ($first as $first_value) { foreach ($second as $second_value) { if ($first_value == $second_value) { $true = true; break; } } if (!isset($true)) { $r[$key][] = $first_value; } unset($true); } } else { $r[$key] = $first; } } } return $r; } ?>
Это должно сделать это, предполагая, что все ключи встречаются в обоих массивах:
$diff = array(); foreach ($session as $key => $values) { $diff[$key] = array_diff($values, $post[$key]); }
Или, потому что мне скучно, а array_map
недоиспользуется:
$diff = array_combine( array_keys($session), array_map(function ($a, $b) { return array_diff($a, $b); }, $session, $post) );
(Предположительно хорошо упорядоченные массивы.)
Вы хотите что-то более или менее:
public function array_diff_multidimensional($arr1, $arr2) { $answer = array(); foreach($arr1 as $k1 => $v1) { // is the key present in the second array? if (!array_key_exists($k1, $arr2)) { $answer[$k1] = $v1; continue; } // PHP makes all arrays into string "Array", so if both items // are arrays, recursively test them before the string check if (is_array($v1) && is_array($arr2[$k1])) { $answer[$k1] = array_diff_multidimensional($v1, $arr2[$k1]); continue; } // do the array_diff string check if ((string)$arr1[$k1] === (string)$arr2[$k1]) { continue; } // since both values are not arrays, and they don't match, // simply add the $arr1 value to match the behavior of array_diff // in the PHP core $answer[$k1] = $v1; } // done! return $answer; }