PHP Сортировать ассоциативный многомерный массив по другому массиву - PullRequest
0 голосов
/ 22 октября 2019

У меня есть массив порядка $order. Я хочу отсортировать ассоциативный массив по этому массиву по полю article. Смысл в том, чтобы отсортировать и другие элементы в этом массиве, такие как title, в этом порядке. Если в массиве больше элементов, чем в массиве сортировки, оставьте их на своих местах, как показано в примере ниже:

Входные данные:

$data = array(
    "title" => array("title 1", "title 2", "title 3", "title 4", "title 5", "title 6"),
    "article" => array("01", "02", "03", "04", "05", "06")
);

$order = ["03", "01", "04", "02"];

Ожидаемый результат:

$data = array(
    "title" => array("title 3", "title 1", "title 4", "title 2", "title 5", "title 6"),
    "article" => array("03", "01", "04", "02", "05", "06")
);

Ответы [ 3 ]

2 голосов
/ 23 октября 2019

Это решение, но оно так же уродливо, как и качество исходных данных, которые у вас есть:

<?php
$input = [
    "title" => ["title 1", "title 2", "title 3", "title 4", "title 5", "title 6"],
    "article" => ["01", "02", "03", "04", "05", "06"]
];
$order = ["03", "01", "04", "02"];
$output = [];

// pick ordered items
foreach($order as $article) {
    $position = array_search($article, $input['article']);
    foreach (array_keys($input) as $key) {
        $output[$key][] = $input[$key][$position];
    }
}

// fill in the rest
foreach ($input['article'] as $position => $article) {
    foreach (array_keys($input) as $key) {
        if (!in_array($article, $order)) {
            $output[$key][] = $input[$key][$position];
        }
    }
}

var_dump($output);

Вывод очевидно:

array(2) {
  ["title"]=>
  array(6) {
    [0]=>
    string(7) "title 3"
    [1]=>
    string(7) "title 1"
    [2]=>
    string(7) "title 4"
    [3]=>
    string(7) "title 2"
    [4]=>
    string(7) "title 5"
    [5]=>
    string(7) "title 6"
  }
  ["article"]=>
  array(6) {
    [0]=>
    string(2) "03"
    [1]=>
    string(2) "01"
    [2]=>
    string(2) "04"
    [3]=>
    string(2) "02"
    [4]=>
    string(2) "05"
    [5]=>
    string(2) "06"
  }
}
0 голосов
/ 23 октября 2019

Если вам нужен более короткий код и меньше циклов:

$properOrderedArray = array_replace(array_flip($data["article"]),array_flip($order));
array_map(function($title,$article,$properOrderedArray) use (&$newOrder){
    $newOrder['title'][$properOrderedArray]=$title;
    $newOrder['article'][$properOrderedArray]=$article;
},$data['title'],$data['article'],$properOrderedArray);
ksort($newOrder['title']);
ksort($newOrder['article']);
print_r($newOrder);

Вывод:

Array
(
    [title] => Array
        (
            [0] => title 3
            [1] => title 1
            [2] => title 4
            [3] => title 2
            [4] => title 5
            [5] => title 6
        )

    [article] => Array
        (
            [0] => 03
            [1] => 01
            [2] => 04
            [3] => 02
            [4] => 05
            [5] => 06
        )

)
0 голосов
/ 23 октября 2019

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

<?php
$data = array(
    "title" => array("title 1", "title 2", "title 3", "title 4", "title 5", "title 6"),
    "article" => array("01", "02", "03", "04", "05", "06")
);

$new_order = ["03", "01", "04", "02"];
$old_order = $data['article'];

// Build a map of before and after key positions.
foreach($old_order as $k => $value) {
    $key = array_search($value, $new_order);
    if($key === false) // No positional change.
        $key = $k;
    $map[$k] = $key; // old position -> new position
}

array_multisort($map, $data['title'], $data['article']);
var_export($data);

Вывод:

array (
  'title' => 
  array (
    0 => 'title 3',
    1 => 'title 1',
    2 => 'title 4',
    3 => 'title 2',
    4 => 'title 5',
    5 => 'title 6',
  ),
  'article' => 
  array (
    0 => '03',
    1 => '01',
    2 => '04',
    3 => '02',
    4 => '05',
    5 => '06',
  ),
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...