0

別の配列へのインデックスを含む PHP 連想配列が、同様に構築された別の連想配列、つまり別の配列へのインデックスを含む連想配列のサブセットであるかどうかを判断することについて質問があります。

2 つの配列があると仮定します。1 つはdogsという名前で、もう1 つはlegged-animalsという名前です。

<?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));
?>

問題は、犬が脚のある動物のサブセットであることをどのように判断できるかということです。

編集:これは、一方が他方のサブセットであるかどうかを調べる私の試みです:

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、配列が必要です。

これを行う簡単な方法はありますか?

4

3 に答える 3

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.";
}

動作するはずです。

于 2013-10-09T22:33:18.827 に答える
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;
}
于 2013-10-10T06:36:04.133 に答える