php - 使用另一个数组作为输入对数组进行排序

标签 php arrays multidimensional-array

<分区>

我想使用下面提供的另一个数组对以下数组进行排序。

例如。我有以下数组:

[note] => Array
(
   [0] => 'note1'
   [1] => 'note2'
   [2] => 'note3'
), 
[text] => Array
(
   [0] => 'text1'
   [2] => 'test3'
), 
[year] => Array
(
   [0] => '2002'
   [1] => '2000'
   [2] => '2011'
)

我有数组:

$sortBy = array('2011', '2000', '2002').

我想根据 $sortBy 数组的值对上面的数组进行排序。

期望的结果是:

[note] => Array
(
   [0] => 'note3'
   [1] => 'note2'
   [2] => 'note1'
), 
[text] => Array
(
   [0] => 'test3'
   [2] => 'text1'
), 
[year] => Array
( 
   [0] => '2011'
   [1] => '2000'
   [2] => '2002'
)

最佳答案

你有一个数组:

$array = array(
    'note' => array('note1', 'note2', 'note3'),
    'text' => array('text1', 'text2', 'text3'),
    'year' => array('2002', '2000', '2011')
);

以及事物的顺序:

$sortBy = array('2011', '2000', '2002');
$sortOrder = $array['year'];

然后您会发现需要如何对年份进行排序:

array_walk($sortOrder, function(&$v) use ($sortBy) {$v = array_search($v, $sortBy);});

然后根据该顺序对整个数组进行排序:

array_multisort($sortOrder, $array['note'], $array['text'], $array['year']);

完整示例:

$array = array(
    'note' => array('note1', 'note2', 'note3'),
    'text' => array('text1', 'text2', 'text3'),
    'year' => array('2002', '2000', '2011')
);
$sortBy = array('2011', '2000', '2002');
$sortOrder = $array['year'];
array_walk($sortOrder, function(&$v) use ($sortBy) {$v = array_search($v, $sortBy);});
array_multisort($sortOrder, $array['note'], $array['text'], $array['year']);

输出/Demo :

Array(
    [note] => Array(
            [0] => note3
            [1] => note2
            [2] => note1
        )
    [text] => Array(
            [0] => text3
            [1] => text2
            [2] => text1
        )
    [year] => Array(
            [0] => 2011
            [1] => 2000
            [2] => 2002
        )
)

编辑: 映射变体,保留 array_search:

$sortBy = array_flip(array('2011', '2000', '2002'));
$sortOrder = $array['year'];
array_walk($sortOrder, function(&$v) use ($sortBy) {$v = $sortBy[$v];});
array_multisort($sortOrder, $array['note'], $array['text'], $array['year']);

Edit2: PHP 5.2 封装到单个函数中,完全参数化:

/**
 * @param array $array
 * @param string|int $by key/offset
 * @param array $order
 * @return array
 */
function array_multisort_by_order(array $array, $by, array $order)
{
    $order = array_flip($order);
    $params[] = $array[$by];
    foreach($params[0] as &$v) $v = $order[$v];
    foreach($array as &$v) $params[] = &$v; unset($v);
    call_user_func_array('array_multisort', $params);
    return $array;
}

// Usage:
array_multisort_by_order($array, 'year', array('2011', '2000', '2002'));

关于php - 使用另一个数组作为输入对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11021814/

相关文章:

java - 如何将文本文件转换为二维字符数组?

Javascript 函数不会在页面上首次加载

javascript - 无法从数据属性解析 JSON

c - 使用 Structure 打印五个成员高度中的第 n 个成员

python - 切片数组并通过在 Python 中使用循环为每个小数组指定特定名称

excel - 有没有办法根据条件初始化公共(public)数组?

c++ - 使用两个不同大小的一维数组制作二维数组

php - 如何设计个人消息数据库?

php - Codeigniter 中包含支付模块

python - 在 numpy 数组中,我们如何只选择 3 的倍数的行?