3

以下に示す別の配列を使用して、次の配列を並べ替えたいと思います。

例えば。私は次の配列を持っています:

[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'
)
4

4 に答える 4

3

配列があります:

$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']);

出力/デモ

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'));
于 2012-06-13T20:10:00.697 に答える
2

私はそれのためにこのような関数を作ります:

function sort_by($arr, $sub, $order){
    // Create a map from old key to new key
    $value_kmap = array_flip($arr[$sub]);
    $sort_kmap = array_flip($order);
    foreach($order as $value)
        $kmap[$value_kmap[$value]] = $sort_kmap[$value];

    // Create your result array
    foreach($arr as $name => $sub_arr)
        foreach($kmap as $key => $new_key)
            if(isset($sub_arr[$key]))
                $result[$name][$new_key] = $sub_arr[$key];

    return $result;
}

この関数は汎用であり、を参照しませんyear。引数としてソートするサブ配列の名前を取ります。次のように使用します。

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

print_r(sort_by($arr, 'year', array('2011', '2000', '2002')));

出力[コードパッド]:

配列
((
    [注]=>配列
        ((
            [0] => note3
            [1] => note2
            [2] => note1
        )。

    [テキスト]=>配列
        ((
            [1] => text3
            [2] => text1
        )。

    [年]=>配列
        ((
            [0] => 2011
            [1] => 2000
            [2] => 2002
        )。

)。
于 2012-06-13T19:32:53.143 に答える
0

$haystackとしてソートされるように配列に名前を付けています。

$newArray = array(); // not necessary, but starts your new array
// you know how you want to sort it, so loop through your sorting array
foreach( $sortBy as $year ){ 
   // get the key of the 2nd level of the 2D array, which we are saving as $k
   foreach( $haystack['year'] as $key => $value ){
      if( $value == $year ) $k = $key;
      break; // since we got what we need, we don't need to let this foreach loop finish
      // you could also do an array_search() here instead of this foreach
   }
   if( $k > 0 ){
      // if k is 0, we didn't find that value so we're not going to sort it or include it in the new array
      foreach( $haystack as $key => $a ){ 
         // just save it into a new array
         $newArray[$key][$k] = $a;       
      }
   }
}
var_dump( $newArray );
于 2012-06-13T19:22:49.757 に答える
0

untested(これらのちょっとした質問を投稿するときは配列のvar_export()を提供する必要があります)

//$orig = ...

$sorted = array();

$map = array_flip($orig['year']);
foreach ($sortBy as $year) {
    $originalNumerickey = $map[$year];
    foreach ($orig as $stringKey => $subArray) {
        $sorted[$stringKey][$originalNumerickey] = $subArray[$originalNumerickey];
    }
}
于 2012-06-13T19:33:37.863 に答える