Перестройте массив PHP и верните 3 самых низких - PullRequest
2 голосов
/ 02 июля 2019

У меня есть список массива примерно так

[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] => 110
        [book_id] => 21
        [price] => 85
    )

[5] => Array
    (
        [id] => 107
        [book_id] => 35
        [price] => 90
    )

[6] => Array
    (
        [id] => 108
        [book_id] => 64
        [price] => 90
    )

[7] => Array
    (
        [id] => 130
        [book_id] => 101
        [price] => 100
    )

Если вы видите массив, он упорядочен по price от самого низкого до самого большого. Я пытаюсь перестроить массив, чтобы получить только 3 самые низкие цены и отфильтровать остальные. Означает, что, когда я делаю фильтрацию, мой массив должен содержать цены от 55 до 85, что по индексу 0-4.

Есть ли способ, которым я могу фильтровать это так? Спасибо.

Ответы [ 3 ]

2 голосов
/ 02 июля 2019

Я думаю, что это может быть довольно просто с базовым циклом 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 голос
/ 02 июля 2019

Хороший метод состоит в том, чтобы перегруппировать массив, чтобы он стал ассоциативным многомерным массивом по цене.
Таким образом, вы можете легко нарезать три элемента, и у вас есть ключи в основном массиве в качестве цен в удобном доступе.

$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);

Возвращает:

array(3) {
  [55]=>
  array(1) {
    [0]=>
    array(3) {
      ["id"]=>
      int(104)
      ["book_id"]=>
      int(32)
      ["price"]=>
      int(55)
    }
  }
  [65]=>
  array(3) {
    [0]=>
    array(3) {
      ["id"]=>
      int(117)
      ["book_id"]=>
      int(76)
      ["price"]=>
      int(65)
    }
    [1]=>
    array(3) {
      ["id"]=>
      int(135)
      ["book_id"]=>
      int(77)
      ["price"]=>
      int(65)
    }
    [2]=>
    array(3) {
      ["id"]=>
      int(100)
      ["book_id"]=>
      int(78)
      ["price"]=>
      int(65)
    }
  }
  [85]=>
  array(1) {
    [0]=>
    array(3) {
      ["id"]=>
      int(101)
      ["book_id"]=>
      int(21)
      ["price"]=>
      int(85)
    }
  }
}

https://3v4l.org/2hARj

1 голос
/ 02 июля 2019

Вот довольно ручной подход, который извлекает цены из данных и использует их в фильтре ...

$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
//          )
//  
//  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...