【问题标题】:php multidimensional array - how to find min value and return keyphp多维数组 - 如何找到最小值并返回键
【发布时间】:2017-06-23 04:37:19
【问题描述】:

我有一个独特的问题,我似乎找不到答案。

我最终想找到在“价格”上具有最小值的数组的索引。

$r = array (
array('id' => 1526,'name'=>"Expedited Parcel",'day'=>1,'price'=>10),
array('id' => 1234,'name'=>"XpressPost Parcel",'day'=>2,'price'=>20),
array('id' => 5345,'name'=>"Internation Shipping",'day'=>7,'price'=>100),
array('id' => 1332,'name'=>"Snail Mail Shipping",'day'=>15,'price'=>10));

您可能还注意到“价格”有重复的值 10。在这种情况下,是否可以比较 $r[0]['day']$r[3]['day'] 的值,然后得出 $index=0?如果 PRICE 和 DAY 相同,那么任何一个都可以。

我想要的结果是print "Free Shipping".$r[$index]['name']." ".$r[$index]['day']." Business Days".

编辑 我发现我的数组不同了,没有索引,但现在有一个名称引用。

$r = array ( 'DOM.EP' => array('id' => 1526,'name'=>"Expedited Parcel",'day'=>1,'price'=>10), 'DOM.PC' => array('id' => 1234,'name'=>"XpressPost Parcel",'day'=>2,'price'=>20), 'DOM.IS' => array('id' => 5345,'name'=>"Internation Shipping",'day'=>7,'price'=>100), 'DOM.SM' => array('id' => 1332,'name'=>"Snail Mail Shipping",'day'=>15,'price'=>10) );

最后编辑感谢大家的帮助!我已经继续结合代码@Kolob Canyon 和@sathish R 来获得我的最终代码。

$min = 9999999999;
$minDay = 9999999999;
$idx = null;
foreach ($r as $key => $value) {
    if($min > $r[$key]['price']) {
            $min = $r[$key]['price'];
            $minDay = $r[$key]['day'];
            $idx = $key;
        } 
        else if ($min == $r[$key]['price']) {
            if ($minDay > $r[$key]['day']){
                $minDay = $r[$key]['day'];
                $idx = $key;
            }
        }
}

if($idx != null) {
        echo "Free Shipping ". $r[$idx]['name'] . " " . $r[$idx]['day'] . " Business Days";
    }

【问题讨论】:

  • 告诉我这是你想要的:- eval.in/821197
  • JJ_StackO 你检查了 cmets 和答案了吗?
  • 谢谢大家...!我已经有一段时间没有编程了,所有这些都非常有帮助!我感谢社区的回应。我将通过它们,看看我是否全部理解!
  • 感谢您接受的回答!

标签: php arrays multidimensional-array


【解决方案1】:

感觉我正在解决你的作业问题:

$min = PHP_INT_MAX;
$idx = null;
for($i=0; $i < count($r); $i++)
{
       if($min > $r[$i]['price']) 
       { 
            $min = $r[$i]['price'];
            $idx = $i;
       }
}

if($idx != null) {
    echo "Free Shipping". $r[$idx]['name'] . " " . $r[$idx]['day'] . " Business Days"; 
}

回答您的修改。

<?php
$r = array (
        'DOM.EP' => array('id' => 1526,'name'=>"Expedited Parcel",'day'=>1,'price'=>10),
        'DOM.PC' => array('id' => 1234,'name'=>"XpressPost Parcel",'day'=>2,'price'=>20),
        'DOM.IS' => array('id' => 5345,'name'=>"Internation Shipping",'day'=>7,'price'=>100),
        'DOM.SM' => array('id' => 1332,'name'=>"Snail Mail Shipping",'day'=>15,'price'=>10)
);

$min = PHP_INT_MAX;
$idx = null;
foreach ($r as $key => $value) {
        if($min > $r[$key]['price'])
        {
            $min = $r[$key]['price'];
            $idx = $key;
        }
    }

    if($idx != null) {
        echo "Free Shipping ". $r[$idx]['name'] . " " . $r[$idx]['day'] . " Business Days";
    }
?>

【讨论】:

  • 我很久没有编程了,我记得为什么我对它有这种爱/恨的关系:) 当我想出一些东西时我会很享受,但当它没有返回结果时会非常沮丧我要大声笑。
【解决方案2】:

您可以使用简单的 for 循环来实现您的结果。

$r = array ( array('id' => 1526,'name'=>"Expedited Parcel",'day'=>1,'price'=>10), array('id' => 1234,'name'=>"XpressPost Parcel",'day'=>2,'price'=>20), array('id' => 5345,'name'=>"Internation Shipping",'day'=>7,'price'=>100), array('id' => 1332,'name'=>"Snail Mail Shipping",'day'=>15,'price'=>10)); $minPrice=PHP_INT_MAX ,$minDay =PHP_INT_MAX,$index=-1 ; $i=0; foreach($r as $d) { if($d['price'] < $minPrice) { $minPrice = $d['price']; $minDay = $d['day']; $index = $i; } else if($d['price'] == $minPrice ) { if($d['day'] < $minDay ) { $minDay = $d['day']; $index = $i; } } $i++; } if($index >=0 ) { echo "Free Shipping". $r[$index]['name'] . " " . $r[$index]['day'] . " Business Days"; }

【讨论】:

  • 我试过用这个,效果很好!但是,我的数组变成了没有索引的多维数组。 $r = array ( 'DOM.EP' =&gt; array('id' =&gt; 1526,'name'=&gt;"Expedited Parcel",'day'=&gt;1,'price'=&gt;10), 'DOM.PC' =&gt; array('id' =&gt; 1234,'name'=&gt;"XpressPost Parcel",'day'=&gt;2,'price'=&gt;20), 'DOM.IS' =&gt; array('id' =&gt; 5345,'name'=&gt;"Internation Shipping",'day'=&gt;7,'price'=&gt;100), 'DOM.SM' =&gt; array('id' =&gt; 1332,'name'=&gt;"Snail Mail Shipping",'day'=&gt;15,'price'=&gt;10) );
  • 我可以直接引用 $r['DOM.EP']['name'] 但很困惑 $index 现在如何拉 'DOM.EP'?我会用 array_keys 代替 $index = $i 吗?
【解决方案3】:

你可以这样做:

$dealersMin = min(array_column($dealers, 'count'));

$dealersWithMinCount = array_filter($dealers, function ($dealer) {
    global $dealersMin;
    return ($dealer['count'] == $dealersMin);
});

var_dump($dealersWithMinCount[array_rand($dealersWithMinCount)]['id']);

希望这会奏效....

你可以在这里看到更多https://eval.in/819623

【讨论】:

  • 使用global 是一种不好的做法。您可以将其替换为function ($dealer) use ($dealersMin)
  • 您好!我之前确实看过这个,不幸的是它返回了值而不是特定的键。
【解决方案4】:

使用原生函数 asort 对数组重新排序

<?php

// your array
$r = array (
        array('id' => 1526,'name'=>"Expedited Parcel",'day'=>1,'price'=>10),
        array('id' => 1234,'name'=>"XpressPost Parcel",'day'=>2,'price'=>20),
        array('id' => 5345,'name'=>"Internation Shipping",'day'=>7,'price'=>100),
        array('id' => 1332,'name'=>"Snail Mail Shipping",'day'=>15,'price'=>10)
);

// getting the columns
$col_id     = array_column($r, 'id');   
$col_name   = array_column($r, 'name');
$col_day    = array_column($r, 'day');
$col_price  = array_column($r, 'price');


// reordering the columns - first the price, second the day
$new_r = array();

$i=0;
foreach($col_id as $id)
{
    $new_r[] = array(
                    'price'=>$col_price[$i],
                    'day'=>$col_day[$i],
                    'id'=>$id,
                    'name'=>$col_name[$i],
                    );
    $i++;
}

// asort the new array - php will do what you want following the order of the columns       
asort($new_r);      
var_dump($new_r);   

//Then get the desired element (the first in the array above)

$free = array_shift($new_r); //get first element of the array $new_r
print "Free Shipping: ".$free['name']." ".$free['day']." Business Days";

脚本的输出:

array (size=4)
  0 => 
    array (size=4)
      'price' => int 10
      'day' => int 1
      'id' => int 1526
      'name' => string 'Expedited Parcel' (length=16)
  3 => 
    array (size=4)
      'price' => int 10
      'day' => int 15
      'id' => int 1332
      'name' => string 'Snail Mail Shipping' (length=19)
  1 => 
    array (size=4)
      'price' => int 20
      'day' => int 2
      'id' => int 1234
      'name' => string 'XpressPost Parcel' (length=17)
  2 => 
    array (size=4)
      'price' => int 100
      'day' => int 7
      'id' => int 5345
      'name' => string 'Internation Shipping' (length=20)

Free Shipping: Expedited Parcel 1 Business Days

进行更改价格和日期值的测试。

【讨论】:

    【解决方案5】:

    代码:

    <?php
    $temp_array = array();
    $r = array (
    array('id' => 1526,'name'=>"Expedited Parcel",'day'=>1,'price'=>10),
    array('id' => 1234,'name'=>"XpressPost Parcel",'day'=>2,'price'=>20),
    array('id' => 5345,'name'=>"Internation Shipping",'day'=>7,'price'=>100),
    array('id' => 1332,'name'=>"Snail Mail Shipping",'day'=>15,'price'=>10));
    
    foreach($r as $row)
    {
        if(count($temp_array)!=0)
        {
            if($temp_array['price']>$row['price'])
            {
                $temp_array['id'] = $row['id'];
                $temp_array['name'] = $row['name'];
                $temp_array['day'] = $row['day'];
                $temp_array['price'] = $row['price'];
            }
            else if($temp_array['price'] == $row['price'])
            {
                if($temp_array['day']>$row['day'])
                {
                    $temp_array['id'] = $row['id'];
                    $temp_array['name'] = $row['name'];
                    $temp_array['day'] = $row['day'];
                    $temp_array['price'] = $row['price'];
                }
            }
        }
        else
        {
            $temp_array['id'] = $row['id'];
            $temp_array['name'] = $row['name'];
            $temp_array['day'] = $row['day'];
            $temp_array['price'] = $row['price'];
        }
    }
    echo "Free Shipping :".$temp_array['name'].", ".$temp_array['day']." Business Days";
    ?>
    

    输出:

    Free Shipping :Expedited Parcel, 1 Business Days
    

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2017-10-21
      相关资源
      最近更新 更多