簡體   English   中英

PHP如何通過多維父數組中的子數組通過鍵取消設置子數組?

[英]PHP how to unset a sub-array by key from a sub-array within a multi dimensional parent array?

我這里有一個包含一組重復ID的數組,每個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) {
}

對於每個迭代,您都希望檢查它們是否已經迭代過。 因此,您想跟蹤這些鍵。 我會做這樣的事情:

$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]);
        }
    }
}

如果我理解您的問題(對此表示懷疑),那么此代碼應該可以助您一臂之力

$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
        )

)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM