1

DESC次の配列があり、別の配列に従って並べ替えたいASC

$array = array(
    'note' => array('test', 'test1', 'test2', 'test3', 'test4'),
    'year' => array('2011','2010', '2012', '2009', '2010'),
    'type' => array('journal', 'conference', 'conference', 'conference','conference'),
);

array_multisort() 内のカスタム関数でそれを行うことは可能ですか?

例えば:

array_multisort($array['type'], $array['year'], custom_function, $array['note']);

それ以外の:

array_multisort($array['type'], $array['year'], SORT_ASC, $array['note']);
4

2 に答える 2

2

配列の深さがわかっている場合は、並べ替える各配列要素にusortを適用するだけです。

カスタム配列に従って注文する例を次に示します。

<?php
$order = array(
    'first',
    'second',
    'third',
    'fourth',
    'fifth'
);

$array = array(
    array(
        'second',
        'fourth',
        'first',
        'third'
    ),
    array(
        'second',
        'first'
    )
);

foreach($array as &$value) {
    usort($value, function($a, $b) use($order) {
        return array_search($a, $order) > array_search($b, $order);
    });
}
unset($value);

var_dump($array);
/*
array(2) {
  [0]=>
  array(4) {
    [0]=>
    string(5) "first"
    [1]=>
    string(6) "second"
    [2]=>
    string(5) "third"
    [3]=>
    string(6) "fourth"
  }
  [1]=>
  array(2) {
    [0]=>
    string(5) "first"
    [1]=>
    string(6) "second"
  }
}
*/

配列がどれだけ深くなるかわからない場合、私の頭に浮かぶ唯一の解決策は再帰関数です。

<?php
$order = array(
    'first',
    'second',
    'third',
    'fourth',
    'fifth'
);

$array = array(
    array(
        'second',
        'fourth',
        'first',
        'third'
    ),
    array(
        array('second', 'first'),
        array('fourth', 'third')
    )
);

function custom_multisort($array, $order) {
    foreach($array as &$value) {
        if(is_array($value[0])) {
            $value = custom_multisort($value, $order);
        } else {
            usort($value, function($a, $b) use($order) {
                return array_search($a, $order) > array_search($b, $order);
            });
        }
    }
    return $array;
}

$array = custom_multisort($array, $order);

var_dump($array);
/*
array(2) {
  [0]=>
  array(4) {
    [0]=>
    string(5) "first"
    [1]=>
    string(6) "second"
    [2]=>
    string(5) "third"
    [3]=>
    string(6) "fourth"
  }
  [1]=>
  array(2) {
    [0]=>
    array(2) {
      [0]=>
      string(5) "first"
      [1]=>
      string(6) "second"
    }
    [1]=>
    array(2) {
      [0]=>
      string(5) "third"
      [1]=>
      string(6) "fourth"
    }
  }
}
*/
于 2012-12-06T10:21:33.197 に答える
-4

それは不可能だと思います。その代わりにこのようにします

$custom_function_value = custom_function();
array_multisort($array['type'], $array['year'], $custom_function_value, $array['note']);

これでお望みの出力が得られると思います。

于 2012-06-20T13:47:53.450 に答える