php保存价格低于最大值的所有子数组的值


Array(
[0] => Array
(
[0] => E
[1] => TIME
[2] => 46.00
[3] => Keck
)
[1] => Array
(
[0] => D
[1] => TIME
[2] => 46.00
[3] => Keck
)
[2] => Array
(
[0] => B
[1] => TIME
[2] => 50.40
[3] => Keck
)
[3] => Array
(
[0] => C
[1] => TIME
[2] => 54.40
[3] => Keck
)
[4] => Array
(
[0] => G
[1] => TIME
[2] => 80.00
[3] => Keck
)
[5] => Array
(
[0] => A
[1] => TIME
[2] => 80.00
[3] => Keck
)

我有一个这样的数组。我想要的是遍历这些子数组,如果值[1]和[3]相同,则检查最大价格,对于所有其他值,则保存[0]值。如果我们有更多的具有最大价格的子数组,则随机选择作为最大值,其他放置作为较低值。所以作为输出,我想要:

Array
(
[0] => E
[1] => D
[2] => B
[3] => C
[4] => A
)

这是我的代码,但它不能满足我的要求:

$res=array();
$Mfr= arrays_column($orginal_array, 1);
$dupes = array_diffs(array_count_values($Mfr), array(1)); // how many times a mfr sku appears [mfrsku_example] => 3
print "nThese are repetitive values:n[mfrsku] => (number of reps)n";
print_r($dupes);
foreach($dupes as $key => $val){
$temp = array_intersect_key(arrays_column($final_array, 3), array_intersect($Mfr, array($key))); 
if(count(array_unique($temp)) < count($temp)){
$temp = array_intersect_key(arrays_column($final_array, 2), array_intersect($Mfr, array($key)));
$temp = array_diffs($temp, array(min($temp)));
$res[] = array_intersect_key(arrays_column($final_array, 0), $temp);
}else{
}
//$res[] = array_intersect_key(arrays_column($final_array, 0), $temp);
//$res[] = $final_array[array_search(max($temp), $temp)][0];
}

您可以使用array_column获取所有价格,并使用第三个参数使返回数组与"letter"关联
然后将其与asort关联排序,结果是该数组的array_keys。

$price = array_column($arr, 2, 0);
asort($price);
$highest = array_intersect($price, [end($price)]); // get all with the highest price
if(count($highest)>1){ // is there more than one
$price = array_diff($price, $highest); // remove all with highets price
$highest = shuffle_assoc($highest); // shuffle associative from https://stackoverflow.com/a/4102803/5159168
$price = array_merge($price, array_slice($highest,0,1)); // add one with highest price 
}
$result = array_keys($price);
var_dump($result);

// https://stackoverflow.com/a/4102803/5159168
function shuffle_assoc($list) { 
if (!is_array($list)) return $list; 
$keys = array_keys($list); 
shuffle($keys); 
$random = array(); 
foreach ($keys as $key) { 
$random[$key] = $list[$key]; 
}
return $random; 
}

退货:

array(5) {
[0]=>
string(1) "E"
[1]=>
string(1) "D"
[2]=>
string(1) "B"
[3]=>
string(1) "C"
[4]=>
string(1) "G" // or A, random
}

https://3v4l.org/GbcpA

您可以使用下一个代码来实现所需的输出:

$arr = array (  
array ( 'E', 'TIME', '46.00', 'Keck', ),
array ( 'D', 'TIME', '22.00', 'Keck', ),
array ( 'B', 'TIME', '80.00', 'Keck', ),
array ( 'C', 'TIME', '55.00', 'Keck', ),
array ( 'G', 'TIME', '33.00', 'Keck', ),
array ( 'A', 'TIME', '80.00', 'Keck', ),
array ( 'A1', 'TIME', '80.00', 'Keck', ),
array ( 'F', 'TIME', '35.00', 'Keck', ),
array ( 'E2', 'TIME2', '46.00', 'Keck2', ),
array ( 'D2', 'TIME2', '22.00', 'Keck2', ),
array ( 'B2', 'TIME2', '76.00', 'Keck2', ),
array ( 'C2', 'TIME2', '55.00', 'Keck2', ),
array ( 'G2', 'TIME2', '76.00', 'Keck2', ), 
);
$res = [];
$one_three = array_unique(array_column($arr, 3, 1));         // unique pairs [1] and [3]
foreach($one_three as $one => $two){
// get separated sets of records for each unique pair of [1] and [3]
$tmp = [];
foreach($arr as $subar){
if ($subar[1] == $one && $subar[3] == $two){
$tmp[$subar[0]] = $subar[2];
} 
}
// values with max price  
$max = max($tmp);    
$rand_ar = [];
foreach($arr as $subar){
if($subar[2] == $max){
$rand_ar[] = $subar[0]; 
} 
}     
// random highest value    
shuffle($rand_ar);                        // shuffle
$rand_val = $rand_ar[0];                  // get one value
$ar_without_dupes = array_diff(array_keys($tmp),$rand_ar);     // remove them all from parent array  
$ar_without_dupes['rand'] = $rand_val;    // store random value
$res = array_merge($res,array_flip($ar_without_dupes));
}
$res = array_keys($res);

输出:

Array
(
[0] => E
[1] => D
[2] => B
[3] => C
[4] => G
[5] => F
[6] => E2
[7] => D2
[8] => B2
[9] => C2
)

演示

如果您输入:

Array
(
[0] => E
[1] => D
[2] => B
[3] => C
[4] => G
)

最新更新