PHP如何从多维父数组中的子数组按键取消设置子数组?

PHP如何从多维父数组中的子数组按键取消设置子数组?,php,arrays,Php,Arrays,我这里有一个数组,它包含一组重复的id,每个id被设置为数组键,子数组包含一个id列表,在同一数组中还有另一个数组 DUPLICATES 16 array(16) { [19503804]=> array(3) { [0]=> string(8) "19501594" [1]=> string(8) "15539642" [2]=> string(8) "19498944" } [19501594]=>

我这里有一个数组,它包含一组重复的id,每个id被设置为数组键,子数组包含一个id列表,在同一数组中还有另一个数组

DUPLICATES 16

array(16) {
  [19503804]=>
  array(3) {
    [0]=>
    string(8) "19501594"
    [1]=>
    string(8) "15539642"
    [2]=>
    string(8) "19498944"
  }
  [19501594]=>
  array(3) {
    [0]=>
    string(8) "19503804"
    [1]=>
    string(8) "15539642"
    [2]=>
    string(8) "19498944"
  }
  [19837033]=>
  array(6) {
    [0]=>
    string(8) "19854557"
    [1]=>
    string(8) "19854558"
    [2]=>
    string(8) "19854553"
    [3]=>
    string(8) "19854565"
    [4]=>
    string(8) "19854554"
    [5]=>
    string(8) "19854683"
  }
  [19854553]=>
  array(6) {
    [0]=>
    string(8) "19854557"
    [1]=>
    string(8) "19854558"
    [2]=>
    string(8) "19837033"
    [3]=>
    string(8) "19854565"
    [4]=>
    string(8) "19854554"
    [5]=>
    string(8) "19854683"
  }
  [19544216]=>
  array(3) {
    [0]=>
    string(8) "19524884"
    [1]=>
    string(8) "19560234"
    [2]=>
    string(8) "19540264"
  }
  [19854565]=>
  array(6) {
    [0]=>
    string(8) "19854557"
    [1]=>
    string(8) "19854558"
    [2]=>
    string(8) "19837033"
    [3]=>
    string(8) "19854553"
    [4]=>
    string(8) "19854554"
    [5]=>
    string(8) "19854683"
  }
  [19854554]=>
  array(6) {
    [0]=>
    string(8) "19854557"
    [1]=>
    string(8) "19854558"
    [2]=>
    string(8) "19837033"
    [3]=>
    string(8) "19854553"
    [4]=>
    string(8) "19854565"
    [5]=>
    string(8) "19854683"
  }
  [15539642]=>
  array(3) {
    [0]=>
    string(8) "19503804"
    [1]=>
    string(8) "19501594"
    [2]=>
    string(8) "19498944"
  }
  [19844271]=>
  array(1) {
    [0]=>
    string(8) "19341140"
  }
  [19498944]=>
  array(3) {
    [0]=>
    string(8) "19503804"
    [1]=>
    string(8) "19501594"
    [2]=>
    string(8) "15539642"
  }
  [16399898]=>
  array(1) {
    [0]=>
    string(8) "15436391"
  }
  [15436391]=>
  array(1) {
    [0]=>
    string(8) "16399898"
  }
  [19341140]=>
  array(1) {
    [0]=>
    string(8) "19844271"
  }
  [19560234]=>
  array(3) {
    [0]=>
    string(8) "19544216"
    [1]=>
    string(8) "19524884"
    [2]=>
    string(8) "19540264"
  }
  [19854683]=>
  array(6) {
    [0]=>
    string(8) "19854557"
    [1]=>
    string(8) "19854558"
    [2]=>
    string(8) "19837033"
    [3]=>
    string(8) "19854553"
    [4]=>
    string(8) "19854565"
    [5]=>
    string(8) "19854554"
  }
  [19540264]=>
  array(3) {
    [0]=>
    string(8) "19544216"
    [1]=>
    string(8) "19524884"
    [2]=>
    string(8) "19560234"
  }
}
注意第一个数组

    [19503804]=>
  array(3) {
    [0]=>
    string(8) "19501594"
    [1]=>
    string(8) "15539642"
    [2]=>
    string(8) "19498944"
  }
“19501594”“15539642”“19498944”还有另一个需要取消设置的数组。因此,在该数组的末尾,仅给出具有唯一值的唯一数组

这是所需的预期输出

array(5) {
  [19503804]=>
  array(3) {
    [0]=>
    string(8) "19501594"
    [1]=>
    string(8) "15539642"
    [2]=>
    string(8) "19498944"
  }
  [19837033]=>
  array(6) {
    [0]=>
    string(8) "19854557"
    [1]=>
    string(8) "19854558"
    [2]=>
    string(8) "19854553"
    [3]=>
    string(8) "19854565"
    [4]=>
    string(8) "19854554"
    [5]=>
    string(8) "19854683"
  }
  [19544216]=>
  array(3) {
    [0]=>
    string(8) "19524884"
    [1]=>
    string(8) "19560234"
    [2]=>
    string(8) "19540264"
  }

  [19844271]=>
  array(1) {
    [0]=>
    string(8) "19341140"
  }
  [16399898]=>
  array(1) {
    [0]=>
    string(8) "15436391"
  }
}
这是我最初编写的代码,由@Dale在下面的答案中提出

$theduplicates = array (
  19503804 => 
  array (
    0 => '19501594',
    1 => '15539642',
    2 => '19498944',
  ),
  19501594 => 
  array (
    0 => '19503804',
    1 => '15539642',
    2 => '19498944',
  ),
  19837033 => 
  array (
    0 => '19854557',
    1 => '19854558',
    2 => '19854553',
    3 => '19854565',
    4 => '19854554',
    5 => '19854683',
  ),
  19854553 => 
  array (
    0 => '19854557',
    1 => '19854558',
    2 => '19837033',
    3 => '19854565',
    4 => '19854554',
    5 => '19854683',
  ),
  19544216 => 
  array (
    0 => '19524884',
    1 => '19560234',
    2 => '19540264',
  ),
  19854565 => 
  array (
    0 => '19854557',
    1 => '19854558',
    2 => '19837033',
    3 => '19854553',
    4 => '19854554',
    5 => '19854683',
  ),
  19854554 => 
  array (
    0 => '19854557',
    1 => '19854558',
    2 => '19837033',
    3 => '19854553',
    4 => '19854565',
    5 => '19854683',
  ),
  15539642 => 
  array (
    0 => '19503804',
    1 => '19501594',
    2 => '19498944',
  ),
  19844271 => 
  array (
    0 => '19341140',
  ),
  19498944 => 
  array (
    0 => '19503804',
    1 => '19501594',
    2 => '15539642',
  ),
  16399898 => 
  array (
    0 => '15436391',
  ),
  15436391 => 
  array (
    0 => '16399898',
  ),
  19341140 => 
  array (
    0 => '19844271',
  ),
  19560234 => 
  array (
    0 => '19544216',
    1 => '19524884',
    2 => '19540264',
  ),
  19854683 => 
  array (
    0 => '19854557',
    1 => '19854558',
    2 => '19837033',
    3 => '19854553',
    4 => '19854565',
    5 => '19854554',
  ),
  19540264 => 
  array (
    0 => '19544216',
    1 => '19524884',
    2 => '19560234',
  ),
)

foreach($theduplicates as $k => $v){
    foreach($v as $d){
        if(isset($theduplicates[$d])){
        unset($theduplicates[$d]);
    }
}
// but it totally cleans theduplicates array
array(0) {
}

如果我理解你的问题(我对此表示怀疑),这段代码应该会让你上路

$array = [
    0 => [5, 6, 7],
    1 => [10],
    5 => [10], // to remove
    6 => [10], // to remove
    7 => [10]  // to remove
];

print_r($array);

foreach ($array as $key => $values) {
    foreach ($values as $value) {
        if(isset($array[$value])) {
            unset($array[$value]);
        }
    }
}

print_r($array);
输出

Array
(
    [0] => Array
        (
            [0] => 5
            [1] => 6
            [2] => 7
        )

    [1] => Array
        (
            [0] => 10
        )

    [5] => Array
        (
            [0] => 10
        )

    [6] => Array
        (
            [0] => 10
        )

    [7] => Array
        (
            [0] => 10
        )

)
Array
(
    [0] => Array
        (
            [0] => 5
            [1] => 6
            [2] => 7
        )

    [1] => Array
        (
            [0] => 10
        )

)

对于每个要检查的迭代,它们都是已经迭代过的键。因此,您希望跟踪这些关键点。我会这样做:

$keys = [];
foreach ($main_array as $k => $set) {
    if (in_array($k, $keys)) {
        unset($main_array[$k]);
        continue;
    }
    foreach ($set as $val) {
        $keys[] = $val;
    }
}

var_dump($main_array);
此代码也可以工作,但您必须通过引用传递:

foreach ($main_array as &$values) {
    foreach ($values as $value) {
        if(isset($main_array[$value])) {
            unset($main_array[$value]);
        }
    }
}

可能很简单,但我不太明白你想做什么-你能修改你的问题以包括预期的输出,加上你试图解决问题的现有代码吗本质上,第一个顶级数组中的值也作为顶级数组出现,需要删除(我想)我不明白你在说什么或需要什么。我没有看到重复的id
19501594
,也没有其他数组。@Steve我已经更新了答案,上面原始数组的预期输出需要缩小到5个数组。@CodeGodie,不,伙计你今天早上不慢,这个场景太疯狂了。如果查看数组键和数组值,您将看到(从顶部开始)数组值是每个ID,其中大多数在父数组中有另一个子数组(作为其键)。我想删除这些内容。@Codedudy你最初是如何创建问题中的重复数组的?我知道它很混乱,它来自一个预先开发的脚本。重复项存储在数据库中,是从mysql结果创建的,用于过滤。有趣的是,我觉得我疯了,这是不可能的。你刚刚做到了。非常感谢。没问题。很高兴我能帮忙。