PHP数组按两个字段值排序并删除重复项

PHP数组按两个字段值排序并删除重复项,php,arrays,Php,Arrays,我有一个这样的数组结构 [0]=>array(3) { ["Number"]=> "L1" ["Location"]=> "Location-A" ["Qty"]=>"1" } [1]=>array(3) { ["Number"]=> "L1" ["Location"]=> "Location-B" ["Qty"]=> "5" } [2]=> array(3) { [

我有一个这样的数组结构

  [0]=>array(3) {
    ["Number"]=> "L1"
    ["Location"]=> "Location-A"
    ["Qty"]=>"1"
  }
  [1]=>array(3) {
    ["Number"]=> "L1"
    ["Location"]=> "Location-B"
    ["Qty"]=> "5"
  }
  [2]=> array(3) {
    ["Number"]=> "L1"
    ["Location"]=> "Location-B"
    ["Qty"]=> "4"
  }
  [3]=>array(3) {
    ["Number"]=> "L2"
    ["Location"]=>  "Location-B"
    ["Qty"]=>  "5"
  }
但我需要以下结构作为输出

 [0]=>array(3) {
    ["Number"]=> "L1"
    ["Location"]=> "Location-A"
    ["Qty"]=>"1"
  }
  [1]=> array(3) {
    ["Number"]=> "L1"
    ["Location"]=> "Location-B"
    ["Qty"]=> "4"
  }
  [2]=>array(3) {
    ["Number"]=> "L2"
    ["Location"]=>  "Location-B"
    ["Qty"]=>  "5"
  }
如何按编号和位置删除重复值

ksort只适用于一个值,我需要删除两个值,如何实现这个PHP

$ordered = array();
foreach ($data as $da) 
{           
    $ordered[$da['Number']] = $da;
    $ordered[$da['Location']] = $da;            
}
ksort($ordered);

在创建新数组时连接两个字段:

foreach ($data as $da) {
    $result[$da['Number'] . '.' . $da['Location']] = $da;
}
$result = array_values($result); // Turn it back into indexed array

试试这个..

 <?php
    $array = array(
        0 => array('Number'=>'L1','Location'=>'Location-A','Qty'=>'1'),
        1 => array('Number'=>'L1','Location'=>'Location-B','Qty'=>'5'),
        2 => array('Number'=>'L1','Location'=>'Location-B','Qty'=>'4'),
        3 => array('Number'=>'L2','Location'=>'Location-B','Qty'=>'5'),
    );
    $output =   array_values(array_intersect_key($array,array_unique(array_map(function($arrayval) {
        return $arrayval['Number'] . '.' .$arrayval['Location'];
    }, $array))
));
    print_r($output);
试试这个:

function array_unique_c($array, Closure $comparer) {
    $result = array();
    for($i = 0; $i < count($array); $i++) {
        $duplicates = false;
        for($n = $i + 1; $n < count($array); $n++) {
            if ($comparer($array[$i], $array[$n])) {
                $duplicates = true;
                break;
            }
        }
        if(!$duplicates) {
            $result[] = $array[$i];
        }
    }

    return $result;
}
输出:

array(3) {
    [0] => array(3) {
        ["Number"] => string(2) "L1"
        ["Location"] => string(10) "Location-A"
        ["Qty"] => string(1) "1"
    }
    [1] => array(3) {
        ["Number"]=> string(2) "L1"
        ["Location"]=> string(10) "Location-B"
        ["Qty"]=> string(1) "4"
    }
    [2]=> array(3) {
        ["Number"]=> string(2) "L2"
        ["Location"]=> string(10) "Location-B"
        ["Qty"]=> string(1) "5"
    }
}

如何知道保留哪一个?创建一个新数组:
array\u tmp()
并使用
array\u push()插入
比较数字和位置。这个问题是一个松散的版本,当你在
Qty
上调用
array\u unique
时,如何返回unique
number
location
?你的结果有两个元素,分别是
number=>L1,location=>location-B
array\u intersect\u key(),
array\u unique()
array\u map()
:在数组上循环3次,一次循环就足够了。不好。它为每对
'Number'
'Location'
保留
$data
中的最后一个值。由于OP没有提到应该为重复项保留哪个值,所以这个解决方案是可以的。代码太复杂(难以理解),由于内部循环,性能很差。通过数组的单个循环就足以满足请求。是的,接受的答案就足以满足请求,但我只是尝试提供一个更抽象的解决方案,可以在更多情况下使用:)
$uniqueArray = array_unique_c($a, function ($itemA, $itemB) {
    return $itemA['Number'] == $itemB['Number'] && $itemA['Location'] == $itemB['Location'];
});
array(3) {
    [0] => array(3) {
        ["Number"] => string(2) "L1"
        ["Location"] => string(10) "Location-A"
        ["Qty"] => string(1) "1"
    }
    [1] => array(3) {
        ["Number"]=> string(2) "L1"
        ["Location"]=> string(10) "Location-B"
        ["Qty"]=> string(1) "4"
    }
    [2]=> array(3) {
        ["Number"]=> string(2) "L2"
        ["Location"]=> string(10) "Location-B"
        ["Qty"]=> string(1) "5"
    }
}