我正在尝试找出一种基于 php 中数组中较高二级值来删除/取消设置重复数组值的简单方法。
以下是原始数组的简单示例。
$ar = array(
array('pid'=>'544', 'discount'=>'26.00','promo_id'=>'9807'),
array('pid'=>'544', 'discount'=>'15.00','promo_id'=>'9821'),
array('pid'=>'544', 'discount'=>'21.00','promo_id'=>'9811'),
array('pid'=>'2965','discount'=>'25.00','promo_id'=>'9810'),
array('pid'=>'2965','discount'=>'30.50','promo_id'=>'9809'),
array('pid'=>'1866','discount'=>'30.00','promo_id'=>'9810'),
array('pid'=>'1866','discount'=>'25.50','promo_id'=>'9809')
);
这将是我想要的新阵列。
$ar = array(
array('pid'=>'544', 'discount'=>'26.00','promo_id'=>'9807'),
array('pid'=>'2965','discount'=>'30.50','promo_id'=>'9809'),
array('pid'=>'1866','discount'=>'30.00','promo_id'=>'9810'),
);
这些是已删除的密钥。
//array('pid'=>'1866','discount'=>'25.50','promo_id'=>'9809') Removed!
//array('pid'=>'544', 'discount'=>'21.00','promo_id'=>'9811'), Removed!
//array('pid'=>'544', 'discount'=>'15.00','promo_id'=>'9821'), Removed!
//array('pid'=>'2965','discount'=>'25.00','promo_id'=>'9810'), Removed!
我想删除'pid'
的任何重复值保持 'discount'
的最高值。
数组可能包含两个以上具有相同'pid'
的键,但它们永远不会具有相同的'pid'
和'promo_id'
。
希望有一个简单的解决方案。
编辑:
这是我一直在尝试的。
foreach($ar as $tkey => $v) {
$tPID = $v['pid'];
$tDISC = $v['discount'];
if ($tPID) {
$key = array_search($tPID, array_column($ar, 'pid'));
$aPID = $ar[$key]['pid'];
$aTPRD = $ar[$key]['discount'];
if ($aTPRD < $tDISC) {
echo '(UN:'.$tkey.')'; unset($ar[$tkey]);
}else
if ($aTPRD > $tDISC) {
echo '(UN:'.$key.')'; unset($ar[$key]);
}else{echo 'else'; }
}
}
答案 0 :(得分:1)
创建一个输出数组,键入&#39; pid&#39;持有为pid找到的最高折扣条目。
使用&#39; array_values&#39;。
提取输出数组Working code at Codepad.org...
建议编辑代码以缩短代码。 但是,我尝试确保代码易于理解,而不是尝试使其成为最少量的代码。无论如何,这段代码非常有效。
<?php //
$ar = array(
array('pid'=>'544', 'discount'=>'26.00','promo_id'=>'9807'),
array('pid'=>'544', 'discount'=>'15.00','promo_id'=>'9821'),
array('pid'=>'544', 'discount'=>'21.00','promo_id'=>'9811'),
array('pid'=>'2965','discount'=>'25.00','promo_id'=>'9810'),
array('pid'=>'2965','discount'=>'30.50','promo_id'=>'9809'),
array('pid'=>'1866','discount'=>'30.00','promo_id'=>'9810'),
array('pid'=>'1866','discount'=>'25.50','promo_id'=>'9809')
);
$outUnique = array();
foreach ($ar as $entry) {
$curPid = $entry['pid'];
if (isset($outUnique[$curPid])) { // check the discount
if ($entry['discount'] > $outUnique[$curPid]['discount']) {
$outUnique[$curPid] = $entry;
}
}
else { // add to the output
$outUnique[$curPid] = $entry;
}
}
// show the entries
var_dump(array_values($outUnique));