重新排列PHP数组并返回最低的3个

时间:2019-07-02 03:32:12

标签: php arrays sorting

我有一个类似这样的数组列表

.as-console-wrapper { max-height: 100% !important; top: 0; }

如果看到该数组,则按<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script> <pre>country,year,sex,num Argentina,1985,male,150 Argentina,1985,female,240 Argentina,1986,male,100 Argentina,1986,female,200 Brazil,1985,male,10 Brazil,1985,female,140 Brazil,1986,male,45 Brazil,1986,female,48</pre>从最低到最大的顺序排列。我正在尝试重新排列阵列,以仅获得3个最低价格,并过滤掉其余价格。意味着,当我进行过滤时,我的数组必须包含55-85之间的价格,该价格来自索引0-4。

有没有办法像这样过滤它?谢谢。

3 个答案:

答案 0 :(得分:2)

我认为使用基本的foreach循环可能会非常简单。

  

如果看到该数组,则按价格从最低到最大的顺序排列。

因此,我假设您的价格已经排序,其他排序是多余的。

您可以遍历并维护遇到的不同价格的计数。 $cnt到达4后,您可以停止收集数据并打印结果。

<?php

$cnt = 0;
$result = [];

foreach($arr as $index => $data){
    if($index === 0 || $data['price'] > $arr[$index-1]['price']){
        $cnt++;
    }

    if($cnt === 4) break;
    $result[] = $data;
}    

echo "<pre>";
print_r($result);

答案 1 :(得分:1)

这是一种相当手动的方法,可以从数据中提取价格并将其用于过滤器中。

$items = array(
  array( 'id' => 104, 'book_id' => 32, 'price' => 55 ),
  array( 'id' => 117, 'book_id' => 76, 'price' => 65 ),
  array( 'id' => 135, 'book_id' => 77, 'price' => 65 ),
  array( 'id' => 100, 'book_id' => 78, 'price' => 65 ),
  array( 'id' => 101, 'book_id' => 21, 'price' => 85 ),
  array( 'id' => 107, 'book_id' => 35, 'price' => 90 ),
  array( 'id' => 108, 'book_id' => 64, 'price' => 90 ),
  array( 'id' => 130, 'book_id' => 101, 'price' => 100 ),
);

// extract unique prices out of the data
$prices = array_unique( array_column( $items, 'price' ) );

// sort the prices (ascending)
sort( $prices );

// extract three prices
$threePrices = array_slice( $prices, 0, 3 );

// filter the items that have a price in the lowest three prices array
$lowestItems = array_filter( $items, function( $item ) use ( $threePrices ) {

  return in_array( $item['price'], $threePrices );

});

print_r( $lowestItems );

//  Array
//  (
//      [0] => Array
//          (
//              [id] => 104
//              [book_id] => 32
//              [price] => 55
//          )
//  
//      [1] => Array
//          (
//              [id] => 117
//              [book_id] => 76
//              [price] => 65
//          )
//  
//      [2] => Array
//          (
//              [id] => 135
//              [book_id] => 77
//              [price] => 65
//          )
//  
//      [3] => Array
//          (
//              [id] => 100
//              [book_id] => 78
//              [price] => 65
//          )
//  
//      [4] => Array
//          (
//              [id] => 101
//              [book_id] => 21
//              [price] => 85
//          )
//  
//  )

答案 2 :(得分:1)

一种好方法是重新排列数组,使其成为价格相关的多维数组。
这样一来,您可以轻松切出三项内容,并且可以轻松访问价格,从而在主阵列中拥有键。

v-if="computedOption"

返回:

$items = array(
  array( 'id' => 104, 'book_id' => 32, 'price' => 55 ),
  array( 'id' => 117, 'book_id' => 76, 'price' => 65 ),
  array( 'id' => 135, 'book_id' => 77, 'price' => 65 ),
  array( 'id' => 100, 'book_id' => 78, 'price' => 65 ),
  array( 'id' => 101, 'book_id' => 21, 'price' => 85 ),
  array( 'id' => 107, 'book_id' => 35, 'price' => 90 ),
  array( 'id' => 108, 'book_id' => 64, 'price' => 90 ),
  array( 'id' => 130, 'book_id' => 101, 'price' => 100 ),
);


foreach($items as $sub){
    // Build new array
    $new[$sub["price"]][] = $sub;
}
//ksort($new); // if you need to sort on price, should not be needed.

$lowest3 = array_slice($new, 0, 3 , true); // slice three and preserve keys with true

var_dump($lowest3);

https://3v4l.org/2hARj