Фильтрация многомерного массива

249
28 января 2019, 17:20

есть многомерный массив вида

[0] => Array
    (
        [book] => 78
        [vol] => 41
        [element] => 1
    )
[1] => Array
    (
        [book] => 78
        [vol] => 59
        [element] => 0
    )
[2] => Array
    (
        [book] => 64
        [vol] => 3
        [element] => 4
    )
[3] => Array
    (
        [book] => 64
        [vol] => 11
        [element] => 3
    )

Как мне найти второй элемент массива? тоесть элемент, где больше book, но меньше vol

Answer 1

Имеем массив:

$arr = [ 
    ['book' => 78, 'vol' => 41, 'element' => 1], 
    ['book' => 78, 'vol' => 59, 'element' => 0], 
    ['book' => 64, 'vol' => 3, 'element' => 4], 
    ['book' => 64, 'vol' => 11, 'element' => 3] 
];

И делаем, как вариант, следующую реализацию:

foreach ($arr as $val)
{
    $key = $val['book'] > $val['vol']
            ? $val['book'] - $val['vol'] : $val['vol'] - $val['book'];
    $res[$key] = $val;
}
krsort($res);
$result = array_shift($res);
print_r($result);

В результате получаем нужные данные:

Array
(
    [book] => 64
    [vol] => 3
    [element] => 4
)
Answer 2

Ваше условие не совсем точное. Дело в том, что наибольшее количество книг может быть у одного элемента, а наименьшее количество скачиваний у другого. Поэтому вам надо придумать значение, которое выражает ваш замысел. Таким значением может быть, например, book/vol (чем больше книг и меньше скачиваний, тем больше это значение). Дело за малым, обойдите массив и выберите элемент с максимальным значением:

$maxVal = null;
$id = null;
foreach($arr as $key => $item) {
    $val = $item['book'] / ($item['vol'] + 1); // +1 чтобы не делить на 0
    if ($maxVal === null || $val > $maxVal) {
        $id = $key;
        $maxVal = $val;
    }
}
var_dump($arr[$id]); 
Answer 3

Как вариант:

foreach ($array as $item){
   $arrayNew[] = $item['vol'];
}
$minVol = min($arrayNew);
foreach ($array as $item){
  if ($item['vol'] == $minVol){
     $arrayNewBook[] = $item['book'];
  }
}
$maxBook = max($arrayNewBook);
foreach ($array as $item){
    if ($item['vol'] == $minVol and $item['book'] == $maxBook) {
      var_dump($item);
    }
}
READ ALSO
Указатели. Ошибка

Указатели. Ошибка

значение типа const char нельзя использовать для инициализации сущности типа char

834
Отсутствует оператор [закрыт]

Отсутствует оператор [закрыт]

Отсутствует оператор ">>" соответствующий этим операндам

526
Универсальное имя символа

Универсальное имя символа

Неправильно сформировано универсальное имя символа, в чём проблема?

446
Qt стили градиентов

Qt стили градиентов

Вопрос по QSSЕсть возможность установки градиентов для виджетов

295