7

2 つの配列があり、これらの配列には に関する情報が含まれておりid、次の形式です。linklabelurl

$pageids = [
    ['id' => 1, 'linklabel' => 'Home', 'url' => 'home'],
    ['id' => 2, 'linklabel' => 'Graphic Design', 'url' => 'graphicdesign'],
    ['id' => 3, 'linklabel' => 'Other Design', 'url' => 'otherdesign'],
    ['id' => 6, 'linklabel' => 'Logo Design', 'url' => 'logodesign'],
    ['id' => 15, 'linklabel' => 'Content Writing', 'url' => 'contentwriting'],
];

$parentpage = [
    ['id' => 2, 'linklabel' => 'Graphic Design', 'url' => 'graphicdesign'],
    ['id' => 3, 'linklabel' => 'Other Design', 'url' => 'otherdesign'],
];

$pageids含まれているが含まれていない情報を見つけるために、これら 2 つを比較しようとしています。$parentpageこれにより、 という別の配列が作成され$pageWithNoChildrenます。ただし、次のコードを使用すると:

$pageWithNoChildren = array_diff_assoc($pageids,$parentpage);

array_diff_assoc()配列の最初のレベルで実行されるため、 と の両方$pageids$parentpages[0] と [1] キーがあることがわかり、それらを無視して$pageids[2] 以降のすべての情報を返します。ただし、ネストされた配列の内容を見て、それらをid比較しlinklabelたい。url$pageids$parentpages

最初の配列のキーではなく、ネストされた配列のキーで実行するようにするにはどうすればよいarray_diff_assoc()ので、最終結果は の [0]、[3]、および [4] 配列の内容を含む配列になります$pageidsか?

期待される結果:

array (
  0 => 
  array (
    'id' => 1,
    'linklabel' => 'Home',
    'url' => 'home',
  ),
  3 => 
  array (
    'id' => 6,
    'linklabel' => 'Logo Design',
    'url' => 'logodesign',
  ),
  4 => 
  array (
    'id' => 15,
    'linklabel' => 'Content Writing',
    'url' => 'contentwriting',
  ),
)
4

5 に答える 5

22

マルチドメインを確認するには、次のようにしてみてください。

$pageWithNoChildren = array_map('unserialize',
    array_diff(array_map('serialize', $pageids), array_map('serialize', $parentpage)));
  • array_map()serialize()各サブ配列をそのサブ配列の文字列表現に変換 するメイン配列の各サブ配列を実行します
    • メイン配列には、配列ではなくサブ配列の文字列表現の値が含まれるようになりました
  • array_diff()比較する配列ごとに 1 次元配列が追加されました
  • 差が返された後、array_map()配列の結果 (差) を実行unserialize()して、文字列表現をサブ配列に戻します。

QED

于 2014-03-12T14:48:44.040 に答える
4

@AbraCadaverの非常に優れたソリューションですが、コメントで述べたように、連想配列の要素がどこでも同じ順序ではない場合があるため、最初にインデックス/キーでソートするカスタム関数が便利です:

function sortAndSerialize($arr){
    ksort($arr);
    return serialize($arr);
}

array_map('unserialize', array_diff(array_map('sortAndSerialize', $pageids), array_map('sortAndSerialize', $parentpage)));
于 2016-08-07T12:42:46.587 に答える
2

正しい方法https://github.com/yapro/helpers/blob/master/src/ArrayHelper.php

class ArrayHelper
{
    /**
     * @param array $array1
     * @param array $array2
     * @return array
     */
    function arrayDiffAssocMultidimensional(array $array1, array $array2): array
    {
        $difference = [];
        foreach ($array1 as $key => $value) {
            if (is_array($value)) {
                if (!array_key_exists($key, $array2)) {
                    $difference[$key] = $value;
                } elseif (!is_array($array2[$key])) {
                    $difference[$key] = $value;
                } else {
                    $multidimensionalDiff = $this->arrayDiffAssocMultidimensional($value, $array2[$key]);
                    if (count($multidimensionalDiff) > 0) {
                        $difference[$key] = $multidimensionalDiff;
                    }
                }
            } else {
                if (!array_key_exists($key, $array2) || $array2[$key] !== $value) {
                    $difference[$key] = $value;
                }
            }
        }
        return $difference;
    }
}
于 2018-07-30T12:02:15.380 に答える