【问题标题】:php arrays - save the values for all subarrays that have the price lower then maximumphp 数组 - 保存价格低于最大值的所有子数组的值
【发布时间】:2020-03-03 10:57:09
【问题描述】:
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];
}

【问题讨论】:

  • [1] 和 [3] 对应于TIMEKeck,不是吗?
  • 正确的@AksenP
  • 那么不应该开启最高价检查
  • 检查1和3值相同的子数组的最高价格
  • 这些值不同

标签: php arrays


【解决方案1】:

您可以使用 array_column 获取所有价格并使用第三个参数使返回数组与“字母”相关联。
然后将其与 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

【讨论】:

  • 你根本没有使用想要的逻辑
  • 这个问题太混乱了,我不明白。所以我复制了预期的输出,让我们看看 OP 说了什么
  • 我描述的输出中没有 G
  • @riririririri 因为它是最高的和重复的?
  • 只因为它的价格最高
【解决方案2】:

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

$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
)

Demo

如果是yours input

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

【讨论】:

  • 但我不想有这样的输出,请查看我的描述
  • @riririririri,这是我的自定义输入的输出。你可以申请your input
  • 好的,但是你现在的输出:[keyA] =>[valueA] 我想要的是 [0] = [keyA]
猜你喜欢
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2018-08-17
相关资源
最近更新 更多