【问题标题】:filtering array removing similar keys过滤数组删除相似键
【发布时间】:2017-04-21 14:41:46
【问题描述】:

我有一个像下面这样的 php 数组 我想删除彼此太近的键,同时保留其中最有价值的键。

例如,在下面这 3 个条目中,我想保留 165,并取消设置其他两个。

[163] => 13
[165] => 15
[166] => 14

同样,在下一对中,我想保留 172 并删除其他的

[169] => 17
[170] => 17
[172] => 19
[174] => 14

我的数组如下所示:

Array(
    [163] => 13
    [165] => 15
    [166] => 14
    [169] => 17
    [170] => 17
    [172] => 19
    [174] => 14
    [206] => 10
    [216] => 13
    [218] => 15
    [220] => 14
    [228] => 15
    [230] => 18
    [231] => 16
    [234] => 13
    [237] => 10
    [245] => 10
    [248] => 12
    [251] => 15
    [254] => 13
    [256] => 14
    [260] => 15
    [262] => 17
    [264] => 17
    [266] => 16
    [268] => 14
    [271] => 11
)

【问题讨论】:

  • 你需要定义“彼此太近”
  • 什么太近了?它取决于值,还是取决于数组中的位置?
  • 不清楚您的标准是什么。什么是“相似”?什么是“离得太近”?
  • 听起来你想让我们做你的功课。
  • "近在咫尺,无论多远"

标签: php arrays


【解决方案1】:

展示了一些可以做的事情。

<?php
$a = array(
    '163' => '13',
    '165' => '15',
    '166' => '14',
    '169' => '17',
    '170' => '17',
    '172' => '19',
    '174' => '14',
    '206' => '10',
    '216' => '13',
    '218' => '15',
    '220' => '14',
    '228' => '15',
    '230' => '18',
    '231' => '16',
    '234' => '13',
    '237' => '10',
    '245' => '10',
    '248' => '12',
    '251' => '15',
    '254' => '13',
    '256' => '14',
    '260' => '15',
    '262' => '17',
    '264' => '17',
    '266' => '16',
    '268' => '14',
    '271' => '11'
);
// arsort( $a ); // sort by value desc
krsort( $a ); // sort by key desc
echo "startet with … ";
print_r( $a );
$d = 0.05; //distance of 5%
$m = false; //flag for first key unset
foreach( $a as $k => $v ) {
    if ( $m === false) { // first key will be max one
        $m = $k;
    }
    else if( ($m - $k) < ($d * $m) ) { //comparison for range = $r = $d*$m; //set absolute range for dropping elms
        unset( $a[$k] );//drop an entry
    } else {
        $m = $k;//set new/lower max for comparison
    }
}
echo "endet up with … ";
print_r( $a );
?>

如果您有更精确的标准来帮助您进行所需的选择。

【讨论】:

  • 您好,先生,我会尽力解释更多。如果查看数组,您会发现键 163、165、166 是彼此接近的数字,可能相差 5% 左右。同样,数字 170、172、174 彼此非常接近。我想将这些键合并为一个键,可能是具有最高值的那个... 172 的值是 19,这是该对中的最高值。谢谢你:)
  • 当您查找排序数组时,您会发现 arsort 以及 php.net/manual/de/array.sorting.php 上的其他方法 - 因此您也可以按键排序并使用自己的规则。
  • 在链接文档中它是 krsort 用于按键而不是值对 desc 进行排序。改变了这件事的代码......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2017-04-27
  • 2016-08-22
  • 1970-01-01
相关资源
最近更新 更多