Как проверить многомерные массивы для заданных пар ключ-значение, т.е. точно такие же ключи и значения? - PullRequest
0 голосов
/ 03 октября 2019

при сравнении с основным массивом он должен возвращать совпадающие ключи основного массива

Например:

$a = array(
   'a' => array('key1' => 'value1', 'key2' => 'value1', 'key3' => 'value1'),
   'b' => array('key1' => 'value2', 'key2' => 'value2', 'key3' => 'value2'), 
   'c' => array('key1' => 'value3', 'key2' => 'value3', 'key3' => 'value3'),
   'd' => array('key1' => 'value2', 'key2' => 'value2', 'key3' => 'value4')
);


1: $search1 = array('key1' => 'value2', 'key2' => 'value2');

при сравнении с вышеуказанным поиском в массиве1 он должен возвращать ключ 'b'и 'd'

т.е. ['b', 'd']

    2: $search2 = array('key1' => 'value3', 'key3' => 'value3');

при сравнении с вышеуказанным массивом search2 он должен возвращать ключ 'c'

т.е. ['c']

    3: $search3 = array('key1' => 'value3', 'key2' => 'value3', 'key3' => 'value3' );

при сравнении с указанным выше поиском по массиву3 он должен возвращать ключ 'c'

т.е. ['c']

    4: $search4 = array('key1' => 'value2');

при сравнении с указанным выше поиском по массиву 4 он должен возвращать ключи 'b' и 'd'

т.е. [ 'B', 'd'] * * тысяча двадцать-три

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Попробуйте,

$output =array(
'a' => array('key1' => 'value1', 'key2' => 'value1', 'key3' => 'value1'),
'b' => array('key1' => 'value2', 'key2' => 'value2', 'key3' => 'value2'), 
'c' => array('key1' => 'value3', 'key2' => 'value3', 'key3' => 'value3'),
'd' => array('key1' => 'value2', 'key2' => 'value2', 'key3' => 'value4')
);

$res = [];
$search = array('key1' => 'value2');

foreach($output as $key => $out)
{
if(isset($search['key1']) && isset($search['key2']) && !array_key_exists('key3',$search))
{
    if($search['key1'] == $out['key1'] && $search['key2'] == $out['key2'])
    {
        $res[] = $key;
    }
}
if(isset($search['key1']) && isset($search['key3']) && !array_key_exists('key2',$search))
{
    if($search['key1'] == $out['key1'] && $search['key3'] == $out['key3'])
    {
        $res[] = $key;
    }
}
if(isset($search['key2']) && isset($search['key3']) && !array_key_exists('key1',$search))
{
    if($search['key2'] == $out['key2'] && $search['key3'] == $out['key3'])
    {
        $res[] = $key;
    }
}
if(!array_key_exists('key1',$search) && !array_key_exists('key2',$search) && isset($search['key3']))
{
   if($search['key3'] == $out['key3'])
    {
        $res[] = $key;
    } 
}
if(!array_key_exists('key2',$search) && !array_key_exists('key3',$search)&& isset($search['key1']))
{
   if($search['key1'] == $out['key1'])
    {
        $res[] = $key;
    } 
}
if(!array_key_exists('key1',$search) && !array_key_exists('key3',$search)&& isset($search['key2']))
{
   if($search['key2'] == $out['key2'])
    {
        $res[] = $key;
    } 
}
if(isset($search['key1']) && isset($search['key2']) && isset($search['key3']))
{
    if($search['key1'] == $out['key1'] && $search['key2'] == $out['key2'] && $search['key3'] == $out['key3'])
    {
        $res[] = $key;
    }
}
}
print_r($res);die();

измените $search с условиями теста, чтобы получить результат ...

0 голосов
/ 03 октября 2019

Вы можете использовать array_intersect_assoc, что-то вроде:

function compareArrays($x, $y){
  $output = []; // Create an empty array to hold the output

  foreach($x as $key => $value): // Loop array $x as key/value
    if (count(array_intersect_assoc($y, $value)) > 0) { // Check if the intersection is greater than 0
      $output[] = $key; // If so, push the key to $output
    }
  endforeach;

  print_r($output); // Do something with the output
}

Вышеприведенная функция принимает 2 аргумента, то есть 2 массива, которые вы хотите сравнить. Первый массив - это основной массив. Он выводит массив элементов, которые не соответствуют первому аргументу. Более полный пример:

$a = array(
   'a' => array('key1' => 'value1', 'key2' => 'value1', 'key3' => 'value1'),
   'b' => array('key1' => 'value2', 'key2' => 'value2', 'key3' => 'value2'), 
   'c' => array('key1' => 'value3', 'key2' => 'value3', 'key3' => 'value3'),
   'd' => array('key1' => 'value2', 'key2' => 'value2', 'key3' => 'value4')
);

$search1 = array('key1' => 'value2', 'key2' => 'value2');
$search2 = array('key1' => 'value3', 'key3' => 'value3');
$search3 = array('key1' => 'value3', 'key2' => 'value3', 'key3' => 'value3' );
$search4 = array('key1' => 'value2');

function compareArrays($x, $y){
  $output = [];

  foreach($x as $key => $value):
    if (count(array_intersect_assoc($y, $value)) > 0) {
      $output[] = $key;
    }
  endforeach;

  print_r($output);
}

compareArrays($a, $search1); // b,d
compareArrays($a, $search2); // c
compareArrays($a, $search3); // c
compareArrays($a, $search4); // b,d

Рабочий пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...