1

次の配列をtypeどこでurl最初に、次にdocで順序付けるにはどうすればよいpageですか?

$array = array(
    0 => array(
        'id' => '14',
        'position' => '0',
        'type' => 'related-url'
    ),
    1 => array(
        'id' => '2367',
        'position' => '0',
        'type' => 'related-doc'
    ),
    2 => array(
        'id' => '99',
        'position' => '0',
        'type' => 'related-page'
    ),
    4 => array(
        'id' => '180',
        'position' => '2',
        'type' => 'related-doc'
    ),
    5 => array(
        'id' => '10',
        'position' => '3',
        'type' => 'related-doc'
    )
);

結果は次のようになります

$array = array(
    0 => array(
        'id' => '14',
        'position' => '0',
        'type' => 'related-url'
    ),
    1 => array(
        'id' => '2367',
        'position' => '0',
        'type' => 'related-doc'
    ),
    4 => array(
        'id' => '180',
        'position' => '2',
        'type' => 'related-doc'
    ),
    5 => array(
        'id' => '10',
        'position' => '3',
        'type' => 'related-doc'
    ),
    2 => array(
        'id' => '99',
        'position' => '0',
        'type' => 'related-page'
    )
);

キーの関連付けを維持することは重要ではありません。

4

5 に答える 5

1
function cmp($a, $b) {

    $sortOrder = array(
        "related-url"   => 1,
        "related-doc"   => 2,
        "related-page"  => 3
    );

    return $sortOrder[$a['type']] - $sortOrder[$b['type']];
}

usort($array, "cmp");
于 2013-02-27T17:37:07.523 に答える
1

まあ、これは醜いですが、うまくいきます)

$doc = array();
$url = array();
$page = array();

foreach($array as $v)
    switch($v['type']){
        case 'related-url': $url[] = $v;break;
        case 'related-doc': $doc[] = $v;break;
        case 'related-page': $page[] = $v;break;
    }

$array = array_merge($url, $doc, $page);
于 2013-02-27T02:03:32.123 に答える
1

どうぞ

function cmp($a, $b) {

    $v1 = $a['type'];
    $v2 = $b['type'];   
    $v1 = str_replace("related-", "", $v1);
    $v2 = str_replace("related-", "", $v2); 
    $firstChar = abs(ord(substr($v1,0,1)) - ord("u"));
    $firstChar2 = abs(ord(substr($v2,0,1)) - ord("u"));

    return $firstChar<=$firstChar2?-1:1; 

}

usort ( $array, "cmp" );
于 2013-02-27T02:13:21.277 に答える
0

これには usort を使用します。簡単な例を次に示します。このロジックが機能すると確信していますが、より良い方法であることは間違いありません。

usort($your_array, function ($elem1, $elem2) {
  if($elem1['type'] == 'related-url')
    return true;

  elseif($elem2['type'] == 'related-url' )
    return false;

  elseif($elem1['type'] == 'related-doc')
    return true;

  else
    return false;
});

element1 が URL の場合は常に true を返し、それがなく、かつ element2 が URL の場合は常に false を返します。これらのステートメントのどちらも true ではなく、element1 が doc の場合、element2 は doc または page であるため、true を返します。最後に、要素 1 がページの場合、要素 2 はドキュメントまたはページのいずれかであるため、常に false を返します。

于 2013-02-27T02:09:38.907 に答える
0

This should work

$urls = $docs = $pages = array();
foreach ($array as $sub) {
    switch($sub['type']) {
        case 'related-url':
            $urls[] = $sub;
        break;
        case 'related-doc':
            $docs[] = $sub;
        break;
        case 'related-page':
            $pages[] = $sub;
        break;
   }
}
$result = array_merge($urls, $docs, $pages);
echo '<pre>', var_dump($result), '</pre>';
于 2013-02-27T02:09:56.520 に答える