【问题标题】:php unique multidimensional array by keeping entry with the highes value from one dimension?php 唯一的多维数组,通过从一维中保持最高值的条目?
【发布时间】:2013-07-21 07:40:26
【问题描述】:

在关于它们的无穷无尽的问题列表中,我还有另一个独特的问题。 我可以想象这个问题很容易解决,但我根本不去解决它。 仅仅因为关于这个主题的问题太多,我无法在这种情况下找到任何有用的东西。

数组:

Array
(
  [0] => Array
    (
      [0] => blabla values
      [1] => 91.181818181818
    )
  [1] => Array
    (
      [0] => blabla same values
      [1] => 95.333333333333
    )
  [2] => Array
    (
      [0] => blabla other values
      [1] => 86
    )
  [3] => Array
    (
      [0] => blabla other values
      [1] => 92.5
    )
  [4] => Array
    (
      [0] => blabla same values
      [1] => 88.5
    )
)

我想通过第一个数组维度来唯一的数组,并且只保留第二个数组中具有最高值的条目。

也许在 MYSQL 中这没什么大不了的,但目前我无法在 php 中实现类似的东西。

所需的输出数组是:

Array
(
  [0] => Array
    (
      [0] => blabla values
      [1] => 91.181818181818
    )
  [1] => Array
    (
      [0] => blabla same values
      [1] => 95.333333333333
    )
  [2] => Array
    (
      [0] => blabla other values
      [1] => 92.5
    )
)

有人有聪明的主意吗?

【问题讨论】:

  • 我更新了我的答案。祝你好运。
  • 感谢您的勾选。下次你可以用var_export输出array,这样我们输入91.181818181818的时间就会节省很多,:)。

标签: php arrays sorting unique multidimensional-array


【解决方案1】:
<?php
$list = array(
    array('blabla values',91.181818181818),
    array('blabla same values', 95.333333333333),
    array('blabla other values', 86),
    array('blabla other values', 92),
    array('blabla same values', 88.5),
);
$result = array();
foreach ($list as $item)
{
    $key = $item[0];
    $value = $item[1];
    if (!isset($result[$key]) || $result[$key][1] < $value)
    {
        $result[$key] = $item;
    }
}
$result = array_values($result);
print_r($result);

输出:

Array
(
    [0] => Array
        (
            [0] => blabla values
            [1] => 91.1818181818
        )

    [1] => Array
        (
            [0] => blabla same values
            [1] => 95.3333333333
        )

    [2] => Array
        (
            [0] => blabla other values
            [1] => 92
        )

)

【讨论】:

  • 逻辑上完全清楚,非常感谢,正是我要找的。​​span>
  • 谢谢!希望这会有所帮助。如有其他问题,请随时在此处发表评论。
  • 但是你为什么不选择我的答案呢?
  • 您的算法似乎更快。所以你得到了勾号。 :)
  • @srain 您可以通过什么方式将 cmets 添加到您的工作中?我有点菜鸟,想更好地理解这一点。非常感谢! (如果你不这样做,我可能仍然会使用它,只是不知道我在做什么:P)
【解决方案2】:
usort($arr, function ($a, $b){
    return $a[1] - $b[1];
});
$out = array();
foreach ($arr as $key => $value){
    $out[$value[0]] = $value[1];
}
$arr = array_map(NULL, array_keys($out), $out);

输出:

 Array
(
    [0] => Array
        (
            [0] => blabla same values
            [1] => 95.333333333333
        )

    [1] => Array
        (
            [0] => blabla other values
            [1] => 86
        )

    [2] => Array
        (
            [0] => blabla values
            [1] => 91.181818181818
        )

)

【讨论】:

  • 因为“98.181818181818”我知道你写了一段时间,现在谁获得了tick? :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多