2013-10-09 2 views
0

У меня возник вопрос о том, является ли ассоциативный массив PHP, содержащий индексы для другого массива, подмножеством другого аналогично сконструированного ассоциативного массива, а именно: индексов к другому массиву.Как определить, является ли ассоциативный массив подмножеством другого ассоциативного массива

Если предположить, что у меня есть два массива, один с именем собак и еще называли ножками-животными.

<?php 
$dogs = array(0 => array('height' => 100, 'weight' => 100), 
       1 => array('height' => 50, 'weight' => 50)); 

$legged-animals = array(0 => array('height' => 200, 'weight' => 500), 
         1 => array('height' => 220, 'weight' => 500), 
         2 => array('height' => 100, 'weight' => 100), 
         3 => array('height' => 50, 'weight' => 50)); 
?> 

Таким образом, вопрос, как я могу определить, что собак является подмножеством ножек-животных?

EDIT: Вот моя попытка выяснить, является ли один является подмножеством другого:

function filter($largeSets, $subSets) 
{ 
    $result = array(); 

    $count = count($subSets); 
    foreach ($largeSets as $individualSet) 
    { 
     foreach ($subSets as $set) 
     { 
      $intersection = array_intersect($individualSet, $set); 

      if (!empty($intersection) && isset($intersection['height']) && isset($intersection['weight'])) 
      { 
       $result['array'][] = $individualSet; 
       $count--; 
       break; 
      } 
     } 
    } 

    $result['result'] = ($count == 0); 

    return $result; 
} 

ОБНОВЛЕНО: Это несколько проще решение, которое я думаю, что будет решить эту проблему. Идея состоит в том, чтобы пройти через многомерный массив, serialize массивов, а затем использовать array_intersect.

$dogs = array(0 => array('height' => 100, 'weight' => 100), 
       1 => array('height' => 50, 'weight' => 50), 
       2 => array('height' => 10, 'weight' => 25)); 

$legged_animals = array(0 => array('height' => 200, 'weight' => 500), 
         1 => array('height' => 220, 'weight' => 500), 
         2 => array('height' => 100, 'weight' => 100), 
         3 => array('height' => 50, 'weight' => 50)); 

foreach ($dogs as $dog) 
{ 
    $arr[] = serialize($dog); 
} 

foreach ($legged_animals as $animal) 
{ 
    $arr2[] = serialize($animal); 
} 
$intersection = array_intersect($arr, $arr2); 
print_r($intersection); 

В этот момент intersection бы распечатать сериализованную форму пересечения. Чтобы получить исходные результаты, вам нужно будет unserialize массивов.

Есть ли более простой способ сделать это?

+0

array_intersect() + счетчик()? –

+0

Можете ли вы объяснить немного больше? Благодаря! –

+0

@ ZhiaChong - Пройдите через подмножество. Если все в надмножестве все хорошо, иначе это не подмножество. Помните диаграммы Венна? –

ответ

-1

array_intersect() делает трюк (не используйте тире в вашем имени массива):

$dogs = array(0 => array('height' => 100, 'weight' => 100), 
       1 => array('height' => 50, 'weight' => 50)); 

$leggedanimals = array(0 => array('height' => 200, 'weight' => 500), 
         1 => array('height' => 220, 'weight' => 500), 
         2 => array('height' => 100, 'weight' => 100), 
         3 => array('height' => 50, 'weight' => 50)); 

print_r(array_intersect($dogs, $leggedanimals)); 
// Array ([0] => Array ([height] => 100 [weight] => 100) [1] => Array ([height] => 50 [weight] => 50)) 
+0

'array_intersect()' действительно не работает на многомерных массивах, подобных этому. Сначала вам нужно сначала сериализовать каждый из внутренних массивов, а затем пересечь массив. –

0

Как об этом многословно метод:

// borrowed from giosh at http://php.net/manual/en/function.array-diff-assoc.php 
function array_diff_assoc_recursive($array1, $array2) { 
    $difference=array(); 
    foreach($array1 as $key => $value) { 
     if(is_array($value)) { 
      if(!isset($array2[$key]) || !is_array($array2[$key])) { 
       $difference[$key] = $value; 
      } else { 
       $new_diff = array_diff_assoc_recursive($value, $array2[$key]); 
       if(!empty($new_diff)) 
        $difference[$key] = $new_diff; 
      } 
     } else if(!array_key_exists($key,$array2) || $array2[$key] !== $value) { 
      $difference[$key] = $value; 
     } 
    } 
    return $difference; 
} 

function array_is_sub($needle,$haystack) 
{ 
    foreach ($needle as $n) 
    { 
    $matched=false; 
    foreach ($haystack as $h) 
    { 
     if (empty(array_diff_assoc_recursive($n, $h))) 
     { 
     $matched=true; 
     break; 
     } 
    } 
    if (!$matched) return false; 
    } 
    return true; 
} 

$dogs = array(0 => array('height' => 100, 'weight' => 100), 
       1 => array('height' => 50, 'weight' => 50)); 

$legged_animals = array(0 => array('height' => 200, 'weight' => 500), 
         1 => array('height' => 220, 'weight' => 500), 
         2 => array('height' => 100, 'weight' => 100), 
         3 => array('height' => 50, 'weight' => 50)); 

if (array_is_sub($dogs,$legged_animals)) { 
    echo "Dogs is a subset of Legged_Animals."; 
} else { 
    echo "Dogs is NOT a subset of Legged_Animals."; 
} 

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

+0

Я правильно понимаю, что вы хотите, чтобы истинные собаки были подмножеством legged_animal и false в противном случае? –

0

Это решение отлично работает для того, что мне нужно:

// takes two multidimensional arrays, $arr1 and $arr2 
// and returns the intersection of the two 
// @return an array that is the intersection of the two 
function findIntersection($arr1, $arr2) 
{ 
    $retArray = array(); 
    $firstArray = array(); 
    $secondArray = array(); 
    $intersection = array(); 

    foreach ($arr1 as $set) 
    { 
     $firstArray[] = serialize($set); 
    } 

    foreach ($arr2 as $set) 
    { 
     $secondArray[] = serialize($set); 
    } 

    $intersection = array_intersect($firstArray, $secondArray); 

    if (!empty($intersection)) 
    { 
     foreach ($intersection as $serializedArray) 
     { 
      $retArray[] = unserialize($serializedArray); 
     } 
    } 

    return $retArray; 
} 
Смежные вопросы