1

2つの配列があり、2つの配列の違いを見つけて、順序付けられていないリストに表示する必要があります。

単一の一致に対してマスター配列をループすることはできますが、複数のキー値についてマスターリストをループして効率的に実行する方法がわかりません。

以下は、各配列からのキー値の抜粋です。

検索するマスターアレイ

foreach ( $levels as $level ) {
  $output .= '<li>' . $level['name'] . '</li>';

一致する可能性のある配列

foreach ( $login_member_levels as $level ) {
  $output .= '<li>' . $level_array[]=$level->level . '</li>';

多次元の質問に関する情報を追加しました...

比較する必要がある2つの多次元配列がありますが、サブ配列が一致していません。

最初の配列[levels][level_id]と[levels][level][id]を比較する必要があります

Array
(
  [success] => 1
  [member] => Array
    (
      [0] => Array
        (
          [ID] => 2
          [UserInfo] => Array
              (
                 [ID] => 2
                 [caps] => Array
                      (
                          [administrator] => 1
                      )
              )
          [Sequential] => 
          [Levels] => Array
            (
                [1347037874] => stdClass Object
                    (
                       [Level_ID] => 1347037874
                       [Name] => HFM-Cardiac Resistance Training Program
                       [Cancelled] => 
                    )

                [1347037875] => stdClass Object
                   (
                       [Level_ID] => 1347037875
                       [Name] => HFM-Official Heart Health Guide
                       [Cancelled] => 
                       [1347037876] => stdClass Object
                       (
                             [Level_ID] => 1347037876
                             [Name] => HFM-All Access Cardiac Success Club
                         [Cancelled] => 
                            )
                    )
        )
    )   

2番目の配列は次のとおりです。

Array
(
    [success] => 1
    [levels] => Array
        (
            [level] => Array
                (
                    [0] => Array
                        (
                            [id] => 1347037871
                            [name] => HFM-Ask the Experts
                            [_more_] => /levels/1347037871
                        )
                    [1] => Array
                        (
                            [id] => 1347037874
                            [name] => HFM-Cardiac Resistance Training Program
                            [_more_] => /levels/1347037874
                        )
                    [2] => Array
                        (
                            [id] => 1347037875
                            [name] => HFM-Official Heart Health Guide
                            [_more_] => /levels/1347037875
                        )
                    [3] => Array
                        (
                            [id] => 1347037876
                            [name] => HFM-All Access Cardiac Success Club
                            [_more_] => /levels/1347037876
                        )
                )
        )
   [supported_verbs] => Array
        (
           [0] => GET
           [1] => POST
        )
)
4

2 に答える 2

2

Jodが正しく提案したように、array_diff関数はarray1とarray2を比較その差を返すことに注意してください。
例:

$array1 = array("green", "red", "blue", "red");
$array2 = array("green", "yellow", "brown");
$result = array_diff($array1, $array2);

var_dump($array1);
var_dump($array2);
var_dump($result);

あなたに与えるでしょう:

// Array1
array(4) {
  [0] => "green"
  [1] => "red"
  [2] => "blue"
  [3] => "red"
}

// Array2
array(3) {
  [0] => "green"
  [1] => "yellow"
  [2] => "brown"
}

// array_diff result
array(3) {
  [1] => "red"
  [2] => "blue"
  [3] => "red"
}

これらはarray1には存在するが、array2には存在しない値であるためです。2つ(または複数)の配列

のすべての違い(値として)を含む配列を取得することに関心がある場合は、そのための関数を作成しました。

function array_diff_all()
{
    $arguments = func_get_args();

    $merged         = array();    
    $intersected    = $arguments[0];
    for ($i = 0; $i < count($arguments); $i++)
    {
        $merged         = array_merge($merged, $arguments[$i]);
        $intersected    = array_intersect($intersected, $arguments[$i]);
    }

    return array_values(array_filter( array_unique(array_diff($merged, $intersected)) ));
}

使用例:(以前と同じ)

$array1 = array("green", "red", "blue", "red");
$array2 = array("green", "yellow", "brown");
$result = array_diff_all($array1, $array2);

var_dump($array1);
var_dump($array2);
var_dump($result);

あなたに与える

// Array1
array(4) {
  [0] => "green"
  [1] => "red"
  [2] => "blue"
  [3] => "red"
}

// Array2
array(3) {
  [0] => "green"
  [1] => "yellow"
  [2] => "brown"
}

// array_diff_all result
array(4) {
  [0] => "red"
  [1] => "blue"
  [2] => "yellow"
  [3] => "brown"
}

注意:
1)インデックス付き配列でのみ適切に機能します。ハッシュ(連想配列)を使用する場合は、キーが一意である場合にのみ適切に機能します。
2)結果の配列のインデックスが再作成されます。これは、値が元の配列とは異なるインデックスを持つ可能性があることを意味します。
3)重複する値が削除され、一意の結果の配列が返されます。
4)一度に複数のアレイを比較できます。
例:

$first  = array('foo', 'moo', 'zoo');
$second = array('foo', 'done', 'gone');
$third  = array('foo', 'mix', 'zoo');

var_dump( array_diff_all($first, $second, $third) );

出力します:

array(5) {
  [0] => "moo"
  [1] => "zoo"
  [2] => "done"
  [3] => "gone"
  [4] => "mix"
}

編集:
質問の2番目の部分について:
比較する2つの配列が完全に異なり、さらに最初の配列にはオブジェクトが含まれているため、特定のケースに前述のアプローチを使用することはできません。
問題を解決するには、次のことを行う必要があります
。A)最初の配列の「レベル」配列にアクセスする方法を理解する。$ array1 ['member']を反復処理する必要があるように見えますが、それぞれに'levels'配列があると思います。
次のようになります。

foreach ($array1['member'] as $member)
{
    $levels = $member['levels'];
    ...
}

この時点で、$levelsは次のようなオブジェクト配列になっているはずです。

[Levels] => Array
    (
        [1347037874] => stdClass Object
            (
        [Level_ID] => 1347037874
        [Name] => HFM-Cardiac Resistance Training Program
        [Cancelled] => 
    )

    [1347037875] => stdClass Object
    (
                [Level_ID] => 1347037875
        [Name] => HFM-Official Heart Health Guide
        [Cancelled] => 
            )

    [1347037876] => stdClass Object
    (
        [Level_ID] => 1347037876
            [Name] => HFM-All Access Cardiac Success Club
        [Cancelled] => 
            )
    )

B)比較する必要のあるlevel_idがこの「levels」配列のキーであるのに対し、array2は「通常の」多次元配列(つまり、オブジェクトを含まない)であることに注意してください。その上にphpの配列関数で。
level_idは、$ array2内で一意になるほど複雑であると想定できるため、$ array2内の「id」キーを比較することなく、特定のlevel_idが値として(再帰的に)$array2内に存在するかどうかのみを確認できます。

これを行うには、次のものが必要です
。C)私が書いた再帰的なin_array関数:

function in_array_recursive($needle, $haystack)
{ 

    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($haystack)); 

    foreach ($it AS $element)
        if ($element === $needle)
            return true; 

    return false; 
}


D) array_filterのコールバック関数として使用されるヘルパーを作成します

function array_diff_helper($var)
{
    global $array2;
    return !(in_array_recursive(trim($var), $array2));
}

異なる場合は、ここで2番目の配列の名前を使用することに 注意してください。
E)最後に、level_idsの違いを取得できます。

$diff = array_filter(array_keys($levels), "array_diff_helper");



だから..あなたが必要とするループは次のように簡単かもしれません

foreach ($array1['member'] as $member)
{
    $not_matching_ids = array_filter(array_keys($member['levels']), "array_diff_helper");
}

これがお役に立てば幸いです、乾杯!:)

于 2012-10-23T21:33:15.173 に答える
1

array_diff()一致しない値の配列を生成するために使用します。

http://php.net/manual/en/function.array-diff.php

于 2012-10-23T20:28:40.950 に答える