2014-11-23 4 views
0

У меня есть несколько массивов, которые я использую в цикле foreach. Я хотел бы ограничить то, что я возвращаю в foreach с помощью значения поля типа. Затем я хотел бы отсортировать цикл foreach по значению оценки (сначала самый высокий).Ограничение массива PHP того же типа (значение)

Итак, в приведенном ниже примере верхний рейтинг и предел 2 одинаковых типов (поэтому он должен вернуть 6 результатов).

array(3) { 
["id"]=> 1 
    ["type"]=> "type1" 
    ["rating"]=> "8.0000" 
} 

array(3) { 
    ["id"]=> 2 
    ["type"]=> "type1" 
    ["rating"]=> "10.0000" 
} 

array(3) { 
    ["id"]=> 3 
    ["type"]=> "type1" 
    ["rating"]=> "6.5000" 
} 

array(3) { 
    ["id"]=> 4 
    ["type"]=> "type2" 
    ["rating"]=> "6.0000" 
} 

array(3) { 
    ["id"]=> 5 
    ["type"]=> "type2" 
    ["rating"]=> "10.0000" 
} 

array(3) { 
    ["id"]=> 6 
    ["type"]=> "type2" 
    ["rating"]=> "6.5000" 
} 

array(3) { 
    ["id"]=> 7 
    ["type"]=> "type3" 
    ["rating"]=> "6.0000" 
} 

array(3) { 
    ["id"]=> 8 
    ["type"]=> "type3" 
    ["rating"]=> "10.0000" 
} 

array(3) { 
    ["id"]=> 9 
    ["type"]=> "type3" 
    ["rating"]=> "6.5000" 
} 

ответ

0

Используйте эти функции:

function sortedByRating($data) { 
    $sorted = array(); 
    foreach($data as $subArray) { 
     $sorted[$subArray['id']] = $subArray['rating']; 
    } 
    asort($sorted); 
    $sorted = array_keys($sorted); 
    $resultArray = array(); 
    foreach($data as $subArray) { 
     $resultArray[array_search($subArray['id'], $sorted)] = $subArray; 
    } 
    ksort($resultArray); 
    return array_values($resultArray); 
} 

function getByType($data, $type) { 
    return array_filter($data, function($subArray) use ($type){ 
     return $subArray['type'] === $type; 
    }); 
} 
0

Возможно, u ищет массив_unique()? http://php.net/manual/en/function.array-unique.php

+0

Спасибо за ваш ответ, я не смогу ограничить значения этим? Мне нужно вернуть не менее 3 (или в примере выше 2) того же типа. – neoszion

+0

Хм, похоже, вам нужно сортировать ур массивы. http://php.net/manual/en/array.sorting.php И ур ситуации позволяют объединить все эти массивы с одним? – WebArtisan

0

Вы можете фильтровать массивы, используя array_filter так:

$data = array(
    array(
     id => 1, 
     type => "type1", 
     rating => "8.0000" 
    ), 
    array(
     id => 2, 
     type => "type1", 
     rating => "10.0000" 
    ), 
    array(
     id => 3, 
     type => "type1", 
     rating => "6.5000" 
    ), 
    array(
     id => 4, 
     type => "type2", 
     rating => "6.0000" 
    ), 
    array(
     id => 5, 
     type => "type2", 
     rating => "10.0000" 
    ) 
); 

$type1 = array_filter(
    $data, 
    function($elem) { 
     return ($elem['type'] === 'type1'); 
    } 
); 

$type1 будет содержать только те элементы, с type => "type1".

Тогда вы можете заказать любой массив, используя uasort(), чтобы отсортировать их по своей собственной функции сравнения. Если вы собираетесь сортировать по рейтингу, тогда конвертируйте оценки в float при сравнении с floatval().

0

Предположим, что ваш массив находится в $ myArr,
Вы можете использовать usort отсортировать массив:

<?php 
usort($myArr, function($a, $b) { 
    return @$a['rating'] - @$b['rating']; 
}); 

И так как вы хотите 2 и не 1 каждого типа, вы можете запустить через отсортированный массив и держать счетчики, чтобы отслеживать, сколько у вас есть (вы также можете сделать что-то подобное с array_filter или что-то, но для простоты я держу это так):

<?php 
$finalArr = array(); 
$counts = array(); 
foreach ($myArr as $item) { 
    if (!isset($counts[$item['type']])) 
     $counts[$item['type']] = 0; 
    $counts[$item['type']]++; 
    if ($counts[$item['type']] < 2) 
     $finalArr[] = $item; 
} 

print_r($finalArr); 
Смежные вопросы