Сортировка значений подмассива в массиве MultiDimension - PullRequest
0 голосов
/ 24 января 2012

Я пытаюсь отсортировать массив, отправленный из канала XML.

Массив выглядит так из print_r ($ answer);:

Array
(
[size] => Array
    (
        [0] => 1.5m x 1.5m
        [1] => 1.5m x 3m
        [2] => 3m x 6.0m
        [3] => 3m x 2.3m
    )

[rate] => Array
    (
        [0] => 80
        [1] => 135
        [2] => 295
        [3] => 180
    )

[sortorder] => Array
    (
        [0] => 3
        [1] => 4
        [2] => 1
        [3] => 2
    )
.
.
.
)

Я хочу получить массив:

    Array
(
[size] => Array
    (
        [0] => 3m x 6.0
        [1] => 3m x 2.3m
        [2] => 1.5m x 1.5m
        [3] => 1.5m x 3m
    )

[rate] => Array
    (
        [0] => 295
        [1] => 180
        [2] => 80
        [3] => 135
    )

[sortorder] => Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
    )
.
.
.
)

То, что я пытаюсь сделать, это использовать подмассив Sort Order для отображения элементов в этом порядке

Я пробовал несколько примеров uasort () и array_multisort (), но, похоже, все упорядочивают под-массивы, а не значения внутри под-массивов

Любые идеи окажут большую помощь. Приветствия

Ответы [ 3 ]

0 голосов
/ 24 января 2012

Могу ли я предложить использовать другую структуру массива, объединяющую каждый размер, норму и порядок сортировки в один элемент:

array(
    array('size' => '...', 'rate' => '...', 'sort order' => '...'),
    ...
)

Это упрощает сортировку и фактически упрощает работу с ней в целом.
Этот код PHP 5.3+ выполняет преобразование и сортировку:

$answer = array_map(function ($size, $rate, $sortorder) {
              return compact('size', 'rate', 'sortorder');
          }, $answer);
usort($answer, function ($a, $b) { return $a['sortorder'] - $b['sortorder']; });
0 голосов
/ 24 января 2012

Этот сортирует $answer['sortorder'] и использует эти ключи для сортировки остальной части $answer без предварительной реструктуризации.

// sort $answer['sortorder'] and retrieve indices.
asort($answer['sortorder']);
$idx = array_keys($answer['sortorder']); 

// do sorting
$sorted = array();
foreach($answer as $key=>$subarr) {
    if ($key != 'sortorder') { // don't sort
    foreach($idx as $i) {
        $sorted[$key][] = $subarr[$i];
    }
    } else {
        // $answer['sortorder'] is already sorted.
        $sorted[$key] = $subarr;
    }
}
print_r($sorted);

Смотрите это в действии здесь .

0 голосов
/ 24 января 2012

Этот подход реструктурирует массив с порядком сортировки по индексу, отсортирует массив и вернет его в исходную структуру.

echo '<pre>';

$array['size'][0] = '1.5m x 1.5m';
$array['size'][1] = '1.5m x 3m';
$array['size'][2] = '3m x 6.0m';
$array['size'][3] = '3m x 2.3m';

$array['rate'][0] = 80;
$array['rate'][1] = 135;
$array['rate'][2] = 295;
$array['rate'][3] = 180;

$array['sortorder'][0] = 3;
$array['sortorder'][1] = 4;
$array['sortorder'][2] = 1;
$array['sortorder'][3] = 2;

$temp = array();
foreach($array['sortorder'] as $key => $value)
{
  $temp[$array['sortorder'][$key]] = array(
    'size'=>$array['size'][$key],
    'rate'=>$array['rate'][$key],
    'sortorder'=>$array['sortorder'][$key]
  );
}
ksort($temp);
$array = array();
foreach($temp as $key => $value)
{
  $array['size'][] = $value['size'];
  $array['rate'][] = $value['rate'];
  $array['sortorder'][] = $value['sortorder'];
}

print_r($array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...