7

私は次の配列を持っています:

$array = array(
        'note' => array(),
        'year' => array('2011','2010', '2012'),
        'type' => array('conference', 'journal', 'conference'),
    );

そして、次の関数を使用して、フィールドタイプと別の配列を使用して配列を並べ替えます。

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;
}

次の関数を呼び出すと、次のエラーが発生します。

$array = array_multisort_by_order($array, 'type', array('conference', 'journal'));

print_r($array['type']);

エラー:

Warning: array_multisort(): Array sizes are inconsistent.

配列に一貫性がないことは知っています。使用するより良い関数はありますか?

チェックしてください:コードパッド

必要な出力:

Array
(
[note] => Array
    (
        [0] => 
        [1] => 
        [2] => 
    )

[year] => Array
    (
        [0] => 2011
        [1] => 2012
        [2] => 2010
    )

[type] => Array
    (
        [0] => conference
        [1] => conference
        [2] => journal
    )

)

例2:

配列

 $array = array(
        'note' => array([0]=>'test1', [1]=>'test2'),
        'year' => array([0]=>'2011', [2]=>'2012'),
        'type' => array([0]=>'conference',[1]=>'journal', [2]=>'conference'),
    );

望ましい結果2

Array
(
[note] => Array
    (
        [0] => test1
        [1] => 
        [2] => tes2
    )

[year] => Array
    (
        [0] => 2011
        [1] => 2012
        [2] => 
    )

[type] => Array
    (
        [0] => conference
        [1] => conference
        [2] => journal
    )

)

ありがとう

4

1 に答える 1

3

さて、頭に浮かぶ最初の解決策の1つは、空の値を追加して一貫性を持たせることです。

function array_multisort_by_order(array $array, $by, array $order)
{
     $max = max(array_map('count',$array));
    //or, alternatively, depending on input (if there are no 'complete' subarrays):
    //$max = max(array_map(function($arr){return max(array_keys($arr));},$array))+1;

    //ADDITION: negative numeric keys:
    $min = min(array_map(function($arr){return min(array_keys($arr));},$array));
    $width = $max - min(0,$min);

    foreach($array as &$sub){
        // $addin = array_diff_key(array_fill(0,$max,null),$sub);
        // $addin changed for negative keys:
        $addin = array_diff_key(array_combine(range($min,$max),array_fill(0,$width,null)),$sub);
        $sub = $addin + $sub;
        ksort($sub);
    }
    $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);
    //no closeures here:
    //foreach($array as &$sub) $sub = array_filter(function($a){return !is_null($a);},$sub);
    $filter = create_function('$a','return !is_null($a);');
    foreach($array as &$sub) $sub = array_filter($sub,$filter);
    return $array;
}
于 2012-06-19T21:12:27.590 に答える