2012-07-16 10 views
0

У меня есть массив, оттянутый из базы данных, упорядоченной по номеру ([0]=>'',[1]=>''...etc). Внутри каждого элемента существуют различные ассоциативные значения (название, дата, область ... и т. Д.). Мне нужно переупорядочить массив, чтобы все элементы с одинаковой переменной «площадь» отображались вместе. Таким образом, мы все равно будем иметь массив ([0]=>'',[1]=>''...etc), но первые 5 или около того будут иметь одну и ту же «область», а затем следующий, но многие из них будут иметь одинаковые «области» и так далее.Группировка php-массива по значению

Чтобы было проще, существует 4 возможных значения для поля «площадь» (север, запад, центральная, долина долины).

Что я не хочу, это многомерный массив, сгруппированный по 4-мя областям, мне нужен он как один длинный массив только в том порядке, который объединяет все «похожие» области.

Не уверен, что я объяснил это так, как я мог, но любая помощь была оценена. Если вам нужно, чтобы я что-то прояснил, просто ответьте, и я добавлю соответствующее.

+2

Возможно, вы должны сделать это в своем SQL-запросе, а не в PHP ... – smilledge

+0

Да, я обычно делаю это, но у меня нет доступа к запросу. Я буквально возвращаю массив, как описано выше. –

+0

Почему у вас нет доступа к нему? Вы используете рамки? Или? – smilledge

ответ

1

Вот решение ...

$arr = array(
    '0' => array('area' => 'west'), 
    '2' => array('area' => 'north'), 
    '3' => array('area' => 'west'), 
    '4' => array('area' => 'central'), 
    '5' => array('area' => 'west'), 
    '6' => array('area' => 'north') 
); 

$new = array(); 

// Get a list of possible areas 
$areas = array(); 
foreach ($arr as $key => $value) { 
    if (! in_array($value['area'] , $areas)) { 
     array_push($areas, $value['area']); 
    } 
} 

// For each area... 
foreach ($areas as $key => $area) { 
    // Find a area that matches... 
    foreach ($arr as $key => $value) { 
     if ($value['area'] == $area) { 
      array_push($new, $value); 
     } 
    } 
} 

Кроме того, вы можете удалить первый цикл, если есть только определенное количество областей. Просто заполните массив областей списком возможных областей в том порядке, в котором вы хотите.

+0

Пригвожденные помощники –

1

Просто отсортируйте массив с помощью специальной функции сортировки с помощью usort, если вы не можете ЗАКАЗАТЬ по полю в SQL. В любом случае не должно быть слишком большой производительности, в зависимости от количества записей в массиве.

usort($posts, function ($a, $b) { return strcmp($a['area'], $b['area']); }); 

Если вы хотите заранее определенный порядок сортировки, добавьте список различных областей и их приоритетов:

$sortOrder = array(
    'north' => 100, 
    'west' => 200, 
    'central' => 300, 
    'blyth valley' => 400, 
); 

usort($posts, function ($a, $b) use ($sortOrder) { 
    if (isset($sortOrder[$a['area']], $sortOrder[$b['area']])) 
    { 
     return $b['area'] - $a['area']; 
    } 

    if (isset($sortOrder[$a['area']])) 
    { 
     return -1; 
    } 

    if (isset($sortOrder[$b['area']])) 
    { 
     return 1; 
    } 

    return 0; 
}); 

Вы можете удалить эти тесты, если у вас есть приоритет, определенный для всех возможных значений поле «область», хотя я бы предложил оставить его, поскольку вы, вероятно, измените возможные значения в будущем.

+0

Что такое $ a и $ b в этом примере? Я получаю $ a может быть массив возможных строк области, а $ posts - массив сообщений, которые требуют упорядочения, но что такое $ b? –

+0

$ a и $ b - это две записи из массива $ posts - два элемента, которые необходимо сравнить, чтобы решить, какой из них «больше» (для сортировки над другим). Функция должна возвращать -1/0/1 в зависимости от того, как сравниваются два элемента, которые strcmp делает, сравнивая значения двух клавиш «область». – MatsLindh

+0

О, я смотрел на него без сортировки.Эта первая функция u, вставленная в usort ($ posts, function ($ a, $ b) {return strcmp ($ a ['area'], $ b ['area']);}); –

Смежные вопросы