【问题标题】:PHP multidimensional array sort & delete rowsPHP多维数组排序和删除行
【发布时间】:2012-02-23 14:55:59
【问题描述】:

我有一个 PHP 多维关联数组,结构如下:

Fields: TYPE - COLOUR - SIZE - PRICE
[0] - rose, var2, var3, price
[1] - rose, var2, var3, price
[2] - daffodil, var2, var3, price
[3] - tulip, var2, var3, price
[4] - rose, var2, var3, price
[5] - tulip, var2, var3, price
[6] - daffodil, var2, var3, price

我想遍历这个数组,对于每种类型,我想选择价格最低的那个,并删除该类型的所有其他行。不必保留密钥。

最后我想要一个数组,每种类型只有一行。

对如何执行此操作感到困惑,因此感激地收到任何指示。

编辑: 抱歉,我的数组可能已经足够清楚了,这是它的另一个 sn-p:

Fields: TYPE - COLOUR - SIZE - PRICE

[0] - type=>rose, colour=>var2, size=>var3, price=>£price
[1] - type=>rose, colour=>var2, size=>var3, price=>£price
[2] - type=>daffodil, colour=>var2, size=>var3, price=>£price
[3] - type=>tulip, colour=>var2, size=>var3, price=>£price
[4] - type=>rose, colour=>var2, size=>var3, price=>£price
[5] - type=>tulip, colour=>var2, size=>var3, price=>£price
[6] - type=>daffodil, colour=>var2, size=>var3, price=>£price

【问题讨论】:

  • 这个关联性如何?
  • 嗨,我现在已经编辑了我上面的示例,以便更清楚地显示它。
  • 您的数组的var_export() 将有助于提供相同的示例。在旁注中,我敢打赌,您将所有这些数据都保存在数据库中。如果是这种情况,您可以将工作卸载到数据库而不是 PHP
  • 嗨,不,我的数据不是来自数据库,而是动态数据。现在就看看你的答案!
  • 那太可惜了 :) 如果您最终将其数据库化,请查看此线程:stackoverflow.com/questions/3998529

标签: php multidimensional-array associative-array


【解决方案1】:

您的任务实际上不需要排序。您只是在搜索最低的项目(adj. per type!)——这可以(仍然!)在 O(n) 中完成。

$cheapest = array();

foreach ($flower as $id => $f) {
  $c_price = $cheapest[$f['type']]['price'];
  if (!$c_price || $f['price'] < $c_price) {
    $cheapest[$f['type']] = $f;
  }
}

print_r($cheapest);

编辑:修改了我的答案。这将创建一个关联数组,键是类型,值是价格最低的原始数组。

祝你好运!

【讨论】:

  • OP 不是简单地搜索最低的项目,而是搜索最低的项目 per TYPE.
  • 我喜欢 "= $f" 解决方案。这比我的优雅多了。
  • @phpmeh,当我了解到“技巧”时它似乎是多余的,但我已经开始在许多情况下使用它来准备数据以供将来使用。
  • @Mikhail 我最喜欢的事情就是遇到教我新技巧的 PHD CS 候选人:P
【解决方案2】:

米哈伊尔解决方案的编辑版本,以返回 OP 要求的内容。

$minid = array();
$minPrice = array();

foreach ($flower as $id => $f) {
  if (!isset($minPrice[$f['type']]) || $f['price'] < $minPrice[$f['type']]) {
    $minPrice[$f['type']] = $f['price'];
    $minid[$f['type']] = $id;
  }
}

$filtered = array();
foreach ($minid as $id)
  $filtered[] = $flower[$id];

【讨论】:

  • 这似乎适用于我创建一个带有数字键的数组,最后在数组中只剩下一种类型。谢谢。
【解决方案3】:
<?php

// First, let's define the data we'll be working through.
$flowers = array(
    array('type'=>'rose',     'colour'=>'var2', 'size'=>'var3', 'price'=>'£9.99' ),
    array('type'=>'rose',     'colour'=>'var2', 'size'=>'var3', 'price'=>'£8.67'),
    array('type'=>'daffodil', 'colour'=>'var2', 'size'=>'var3', 'price'=>'£16.04'),
    array('type'=>'tulip',    'colour'=>'var2', 'size'=>'var3', 'price'=>'£4.39' ),
    array('type'=>'rose',     'colour'=>'var2', 'size'=>'var3', 'price'=>'£12.49'),
    array('type'=>'tulip',    'colour'=>'var2', 'size'=>'var3', 'price'=>'£4.49' ),
    array('type'=>'daffodil', 'colour'=>'var2', 'size'=>'var3', 'price'=>'£11.99'),
);

// Define the array which will store our final flower prices
$flower_prices = array();

// Loop through our flowers to find the lowest price.
foreach($flowers as $flower) {
    // Remove the pound from the price, and cast as a floating point decimal.
    $price = (float) str_replace('£', '', $flower['price']);
    if(!array_key_exists($flower['type'], $flower_prices)) {
        // First flower type encounter. By default, as of right now, this is the "cheapest".
        $flower_prices[$flower['type']] = $flower;
    } else if($price < (float) str_replace('£', '', $flower_prices[$flower['type']]['price'])) {
        // Flower type previously encountered, and the now encountered flower is cheaper.
        $flower_prices[$flower['type']] = $flower;
    }
}

// Now that we've determined which flowers are cheapest, we can print the results:
foreach($flower_prices as $price) {
    print $price['type'] . ': ' . $price['price'] . "\n";
}

【讨论】:

    【解决方案4】:

    让米哈伊尔更进一步,希望能更符合您的要求:

        $selectedRows = array();
        foreach ($flower as $id => $f) {
           if( ! isset( $selectedRows[$f['type']] ) ) {
              $selectedRows[$f['type']]['id'] = $f['id'];
              $selectedRows[$f['type']]['price'] = $f['price'];
           } else {
               if ( $f['price'] < $selectedRows[$f['type']]['price'] ) {
                 $selectedRows[$f['type']]['price'] = $f['price'];
                 $selectedRows[$f['type']]['id'] = $f['id'];
               } 
           }
        }
        // Now you can look through the selectedRows, use the 
        foreach( $selectedRows as $v ){
            echo $flower[$v['id']].' $'.$v['price'].'<br />';
        }
    

    另外,如果你正在制作这样的数组:

    $flower[0]["rose"]["blue"]["large"]["4.99"] = 不管;

    我建议将其更改为:

    $flower[0] => array("type" => "rose", "color" => "blue", "size" => "large", "price" => "4.99" );

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      相关资源
      最近更新 更多