1
array(10) { [0]=> int(5) 
            [1]=> int(8) 
            [2]=> int(2)
            [3]=> int(0)
            [4]=> int(1) 
            [5]=> int(9) 
            [6]=> int(1) 
            [7]=> int(0) 
            [8]=> int(5) 
            [9]=> int(4) 
          }

好的,所以我有一个如上所述的数组。我想要做的是获取前 x 个项目,将它们更改为 1,将其余的更改为 0,而不会弄乱键,以便我可以以正确的顺序将其内爆。所以如果我想要前 5 名,结果应该是这样的:

array(10) { [0]=> int(1) 
            [1]=> int(1) 
            [2]=> int(0)
            [3]=> int(0)
            [4]=> int(0) 
            [5]=> int(1) 
            [6]=> int(0) 
            [7]=> int(0) 
            [8]=> int(1) 
            [9]=> int(1) 
          }

我尝试使用sort,但我认为它弄乱了键。

任何帮助,将不胜感激。谢谢。

4

4 回答 4

0

嗯,我不知道如果我理解问题,但也许:

for ($i = 0; $i < $topX; $i++)
  $arr[$i] = (int)1;
for ($i = $topX+1;$i < count($arr); $i++)
  $arr[$i] = (int)0;

或添加 IF:

for ($i = 0; $i < count($arr); $i++)
  $arr[$i] = ($arr[$i] < $maxVal) ? (int)1 : (int)0;
于 2013-09-19T07:07:35.077 回答
0

好吧,我想这就是你要找的。我相信代码是不言自明的,因为我已经注释了代码中的所有重要概念。

<?php
    function top(&$arr, $top, $start = 0)
    {
        if (count($arr) > $start) {
            // count the number of element that larger 
            // than the element at start position
            $count = 0;     
            for($i = $start + 1; $i < count($arr); $i++) {
                if ($arr[$start] < $arr[$i]) $count++;
            }

            // if there are more than [$top] number of element
            // that is larger than this element
            // it cannot be in the [$top] largest number
            if ($count >= $top) {
                $arr[$start] = 0;
            } else {
                $arr[$start] = 1;
                $top -= 1;
            }

            // continue to next element
            top($arr, $top, $start + 1);
        }
    }

    $arr = array(5, 8, 2, 0, 1, 9, 1, 0, 5, 4);
    top($arr, 5);
    var_dump($arr);
?>
于 2013-09-19T07:18:11.433 回答
0

asort()对数组进行排序并维护索引关联。

于 2013-09-19T07:20:05.833 回答
0

PHP 有一些非常简洁的数组函数可供您使用。这是一种方法:

<?php

function change_top_items($array, $top_x) {

    // first, sort the values and preserve the keys
    uasort($array, function($a, $b) {

         if ($a == $b) return 0;             
         return ($a < $b) ? -1 : 1;

    });

    // put the top x values in an array
    $compare = array_slice($array, -$top_x);

    // now walk through the original array
    $modified = array_map(function($value) use ($compare) {

            // if the current value is in the top x array
            // set it to 1, else set it to 0
        return in_array($value, $compare) ? 1 : 0;

    }, $array);

    // now sort the modified array by keys again and return it
    ksort($modified);

    return $modified;

}

$a = [5, 8, 2, 0, 1, 9, 1, 0, 5, 4];

print_r(change_top_items($a, 5));

差不多就是这样。

输出:

Array
(
    [0] => 1
    [1] => 1
    [2] => 0
    [3] => 0
    [4] => 0
    [5] => 1
    [6] => 0
    [7] => 0
    [8] => 1
    [9] => 1
)

这是一个工作示例:http://3v4l.org/HI2EH -您也可以在那里看到,我使用了仅对 PHP 5.4+ 有效的语法。这涉及短数组表示法和闭包的使用。但是这段代码可以很容易地转换成以前 PHP 版本的语法。

于 2013-09-19T07:33:07.237 回答