【问题标题】:Remove two dimentional array elements(except first match) which array specific value are same/unique删除数组特定值相同/唯一的二维数组元素(第一个匹配除外)
【发布时间】:2021-03-25 06:31:19
【问题描述】:

例如我下面有一个二维数组,

$a = array(
    "one" => array (
        "id" => 111,
        "name" => "Jhon"
    ),
    "two" => array(
        "id" => 222,
        "name" => "Adam"
    ),
    "three" => array(
        "id" => 111,
        "name" => "Mark"
    ),
    "four" => array(
        "id" => 125,
        "name" => "Jhon"
    ),
    "five" => array(
        "id" => 111,
        "name" => "Jhon"
    ),
    "six" => array(
        "id" => 222,
        "name" => "Rock"
    ),
);

我想删除二维数组值相同/唯一的数组(第一个匹配除外)。 例如,我想删除所有 id 键值相同的数组(第一个匹配除外)。 如,数组id键值111(数组计数为3)和222(数组计数为2)。 因此,在删除唯一键 id 后,结果数组应如下所示,

$a = array(
    "one" => array (
        "id" => 111,
        "name" => "Jhon"
    ),
    "two" => array(
        "id" => 222,
        "name" => "Adam"
    ),
    "four" => array(
        "id" => 125,
        "name" => "Jhon"
    ),
);

【问题讨论】:

    标签: php arrays unique


    【解决方案1】:

    您需要保留一个带有添加键的数组。您可以使用array_filter() 删除不必要的行。

    代码:(demo)

    $array = [
        "one"   => ["id" => 111, "name" => "Jhon"],
        "two"   => ["id" => 222, "name" => "Adam"],
        "three" => ["id" => 111, "name" => "Mark"],
        "four"  => ["id" => 125, "name" => "Jhon"],
        "five"  => ["id" => 111, "name" => "Jhon"],
        "six"   => ["id" => 222, "name" => "Rock"],
    ];
    
    // store added IDs
    $added = [];
    
    // filter array (need to pass $added as reference to be updated)
    $output = array_filter($array, function($item) use (&$added) 
    {
        // shortcut for readability
        $id = $item['id'];  
        // Check if id already exists
        if (isset($added[$id])) { return false; } 
        // add to reference
        $added[$id] = true; 
        // add to final array
        return true; 
    });
    
    unset($added); // no longer needed.
    
    var_dump($output);
    

    输出:

    array(3) {
      ["one"]=>
      array(2) {
        ["id"]=>
        int(111)
        ["name"]=>
        string(4) "Jhon"
      }
      ["two"]=>
      array(2) {
        ["id"]=>
        int(222)
        ["name"]=>
        string(4) "Adam"
      }
      ["four"]=>
      array(2) {
        ["id"]=>
        int(125)
        ["name"]=>
        string(4) "Jhon"
      }
    }
    

    【讨论】:

      【解决方案2】:

      使用此代码完成您的任务

          <?php
      $a = array(
          "one" => array (
              "id" => 111,
              "name" => "Jhon"
          ),
          "two" => array(
              "id" => 222,
              "name" => "Adam"
          ),
          "three" => array(
              "id" => 111,
              "name" => "Mark"
          ),
          "four" => array(
              "id" => 125,
              "name" => "Jhon"
          ),
          "five" => array(
              "id" => 111,
              "name" => "Jhon"
          ),
          "six" => array(
              "id" => 222,
              "name" => "Rock"
          ),
      );
      $unique = [];
      $final_array = [];
      foreach ($a as  $value) {
          if(in_array($value['id'],$unique)){
              continue;
          }
          else {
              $unique[] = $value['id'];
              $final_array[] = $value;
          }
      } 
      echo "<pre>";
      print_r($final_array);
      ?>
      

      这里我使用了一个唯一的命名数组,我在其中放置唯一键并循环遍历数组,如果 id 存在于唯一的然后它跳过,否则我将它添加到最终数组中。 希望这能解决您的问题。

      【讨论】:

      • final_array 中缺少键(onetwofour)。
      猜你喜欢
      • 1970-01-01
      • 2011-06-03
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多