How can you make a multidimensional array unique?

后端 未结 6 1074
陌清茗
陌清茗 2020-11-27 08:03

I\'ve got a multidimensional array setup like the following:

array(
  [0]=>
  array(
    [\"name\"]=> \"Foo\"
    [\"slug\"]=> \"Bar\"
  )
  [1]=>         


        
相关标签:
6条回答
  • 2020-11-27 08:24

    Much simpler solution for your multidimensional array.

    $unique = array_map('unserialize', array_unique(array_map('serialize', $array)));
    
    echo "<pre>";
    print_r($unique);
    
    0 讨论(0)
  • 2020-11-27 08:27
    function multi_array_unique_by_value($array, $colon = '')
    {
        $ret_array = array();
        $has_array = array();
        foreach($array as $item)
        { 
            $item_array = (array)$item;
            if(!in_array($item_array[$colon], $has_array))
            {
                array_push($ret_array, $item);
                array_push($has_array, $item_array[$colon]);
            }
        }
        return $ret_array;
    }
    

    You can give your array here and give a colon name for making unique.

    On this code, you have multidimensonal array, we foreach that array, which column index for us, we pushing that column values. And when same value, its not adding return array.

    So this solution for array_unique for 1 coloumn.

    0 讨论(0)
  • 2020-11-27 08:30
    $array = array(
        0 => array(
            "name"=> "Foo",
            "slug"=> "Bar"
        ),
        1 => array(
            "name"=> "Foo",
            "slug"=> "Bar"
        ),
        2 => array(
            "name"=> "Test 1",
            "slug"=> "test-1"
        ),
        3 => array(
            "name"=> "Test 2",
            "slug"=> "test-2"
        ),
        4 => array(
            "name"=> "Test 3",
            "slug"=> "test-3"
        )
    );
    
    
    
    function array_unique_by_key (&$array, $key) {
        $tmp = array();
        $result = array();
        foreach ($array as $value) {
            if (!in_array($value[$key], $tmp)) {
                array_push($tmp, $value[$key]);
                array_push($result, $value);
            }
        }
        return $array = $result;
    }
    
    array_unique_by_key($array, "name");
    
    0 讨论(0)
  • 2020-11-27 08:31

    Since everyone given alternatives, here's a solution to the problem at-hand. Sometimes we have to work with the data we have, not re-arrange it the way we like it. That being said, this will remove all sub-sequent entries from the array that are duplicates.

    $array = Array(
      Array(
        'name'  => 'Test 3',
        'slug'  => 'test-3'
      ),
      Array(
        'name'  => 'Foo',
        'slug'  => 'Bar'
      ),
      Array(
        'name'  => 'Foo',
        'slug'  => 'Bar'
      ),
      Array(
        'name'  => 'Test 1',
        'slug'  => 'test-1'
      ),
      Array(
        'name'  => 'Test 2',
        'slug'  => 'test-2'
      ),
      Array(
        'name'  => 'Test 3',
        'slug'  => 'test-3'
      ),
    );
    var_dump($array);
    
    for ($e = 0; $e < count($array); $e++)
    {
      $duplicate = null;
      for ($ee = $e+1; $ee < count($array); $ee++)
      {
        if (strcmp($array[$ee]['name'],$array[$e]['name']) === 0)
        {
          $duplicate = $ee;
          break;
        }
      }
      if (!is_null($duplicate))
        array_splice($array,$duplicate,1);
    }
    var_dump($array);
    

    Which will look like this:

    array(6) {
      [0]=>
      array(2) {
        ["name"]=>
        string(6) "Test 3"
        ["slug"]=>
        string(6) "test-3"
      }
      [1]=>
      array(2) {
        ["name"]=>
        string(3) "Foo"
        ["slug"]=>
        string(3) "Bar"
      }
      [2]=>
      array(2) {
        ["name"]=>
        string(3) "Foo"
        ["slug"]=>
        string(3) "Bar"
      }
      [3]=>
      array(2) {
        ["name"]=>
        string(6) "Test 1"
        ["slug"]=>
        string(6) "test-1"
      }
      [4]=>
      array(2) {
        ["name"]=>
        string(6) "Test 2"
        ["slug"]=>
        string(6) "test-2"
      }
      [5]=>
      array(2) {
        ["name"]=>
        string(6) "Test 3"
        ["slug"]=>
        string(6) "test-3"
      }
    }
    array(4) {
      [0]=>
      array(2) {
        ["name"]=>
        string(6) "Test 3"
        ["slug"]=>
        string(6) "test-3"
      }
      [1]=>
      array(2) {
        ["name"]=>
        string(3) "Foo"
        ["slug"]=>
        string(3) "Bar"
      }
      [2]=>
      array(2) {
        ["name"]=>
        string(6) "Test 1"
        ["slug"]=>
        string(6) "test-1"
      }
      [3]=>
      array(2) {
        ["name"]=>
        string(6) "Test 2"
        ["slug"]=>
        string(6) "test-2"
      }
    }
    
    0 讨论(0)
  • 2020-11-27 08:31

    You can use an associative array.

    $temp_array = array();
    foreach ($array as &$v) {
        if (!isset($temp_array[$v['name']]))
            $temp_array[$v['name']] =& $v;
    }
    

    This creates a temporary array, using $v['name'] as the key. If there is already an element with the same key, it is not added to the temporary array.

    You can convert the associative array back to a sequential array, using

    $array = array_values($temp_array);
    

    Example code and output: http://codepad.org/zHfbtUrl

    0 讨论(0)
  • 2020-11-27 08:34

    Just looking at your particular case, I would recommend using a hash table instead of a 2-dimensional array. If you use your "name" as the key in the hash, each entry would be unique.

    Is there a specific need for the multidimensional array?

    0 讨论(0)
提交回复
热议问题