0

私は次のデータ構造を持っています:

array (size=3)
  0 => 
    array (size=4)
      0 => string 'apple' (length=5)
      1 => string 'colophon' (length=8)
      2 => string 'byo-fusion-drive' (length=16)
      3 => string 'scroll-targeting' (length=16)
  1 => 
    array (size=3)
      0 => string 'apply' (length=5)
      1 => string 'exploring-web-typography' (length=24)
      2 => string 'on-performance-content-management' (length=33)
  2 => 
    array (size=3)
      0 => string 'macbook' (length=7)
      1 => string 'colophon' (length=8)
      2 => string 'nifty-minidrive' (length=15)

配列のコレクション内のどの配列が共通の値を共有しているかを調べようとしています。

例:配列0と2は文字列「colophon」を共有します。

array_intersectを使用してみましたが、もちろん、配列1には他の配列と共通の値がないため、これはNULLを返します。

また、特定のコレクションに共通の値がない可能性もあります(おそらくさえ)。配列のコレクションには、常に少なくとも2つの配列が含まれます。コレクションには、追加の配列がいくつあってもかまいません。

上記のデータを使用すると、最終結果は次のようになります。

array (size=2)
  0 => 
    array (size=4)
      0 => string 'apple' (length=5)
      1 => string 'colophon' (length=8)
      2 => string 'byo-fusion-drive' (length=16)
      3 => string 'scroll-targeting' (length=16)
  1 => 
    array (size=3)
      0 => string 'macbook' (length=7)
      1 => string 'colophon' (length=8)
      2 => string 'nifty-minidrive' (length=15)

つまり、配列1(元の配列から)は共通の値を共有していないため、削除されています。

これを行う簡単な方法があると確信していますが、私は今8時間以上試していて、助けを求めることにしました。

誰?

4

2 に答える 2

1

ネストされたループで繰り返す必要があります。そのようです:

$array = array(
    array(
        "apple",
        "colophon",
        "byo-fusion-drive",
        "scroll-targeting"
    ),
    array(
        "apply",
        "exploring-web-typography",
        "on-performance-content-management"
    ),
    array(
        "macbook",
        "colophon",
        "nifty-minidrive"
    )
);

for ($i = 0; $i < count($array); $i++) {
    for ($j = $i+1; $j < count($array); $j++) {
        var_dump(array_intersect($array[$i], $array[$j]));
    }
}

どの出力:

array (size=0)
  empty
array (size=1)
  1 => string 'colophon' (length=8)
array (size=0)
  empty

ループを簡単に変更すると、期待される動作が得られます。

$result = array();

for ($i = 0; $i < count($array); $i++) { //Start from the first array, and continue up to all of them.
    for ($j = $i+1; $j < count($array); $j++) { //Start with the current array of $i, +1. So that collisions never occur.
        if (count(array_intersect($array[$i], $array[$j])) !== 0) { //If there are common values (the array_intersect() function returns a non-empty array
            if (!in_array($array[$i], $result)) $result[] = $array[$i]; //Add the first array (if it's not there already)
            if (!in_array($array[$j], $result)) $result[] = $array[$j]; //Add the second array (if it's not there already)
        }
    }
}

どの出力

array (size=2)
  0 => 
    array (size=4)
      0 => string 'apple' (length=5)
      1 => string 'colophon' (length=8)
      2 => string 'byo-fusion-drive' (length=16)
      3 => string 'scroll-targeting' (length=16)
  1 => 
    array (size=3)
      0 => string 'macbook' (length=7)
      1 => string 'colophon' (length=8)
      2 => string 'nifty-minidrive' (length=15)
于 2012-11-03T13:42:05.453 に答える
1

試す

$arr = array (
  array('apple', 'colophon', 'byo-fusion-drive', 'scroll-targeting', ),
  array('apply', 'exploring-web-typography', 'on-performance-content-management', ),
  array('macbook', 'colophon', 'nifty-minidrive', 'nifty-minidrive', ),
);

$repeated_values = array_keys(
  array_filter(
    array_count_values(
      array_reduce($arr, function ($res, $value) {
          return array_merge($res, array_unique($value));
        }, array()
      )
    ), function ($count) {
      return $count > 1;
  })
);

$result = array_filter($arr, function($value) use ($repeated_values) {
   if (sizeof(array_intersect($repeated_values, $value)) > 0) return true;
});

var_dump($result);

出力

array (size=2)
  0 => 
    array (size=4)
      0 => string 'apple' (length=5)
      1 => string 'colophon' (length=8)
      2 => string 'byo-fusion-drive' (length=16)
      3 => string 'scroll-targeting' (length=16)
  2 => 
    array (size=4)
      0 => string 'macbook' (length=7)
      1 => string 'colophon' (length=8)
      2 => string 'nifty-minidrive' (length=15)
      3 => string 'nifty-minidrive' (length=15)
于 2012-11-03T13:46:10.650 に答える