2

都市名でソートされた、このような配列があります。PHP でこの配列を並べ替えてニューヨークを一番上に表示し、次にロンドンを表示し、残りを現在のように都市名で並べ替える最も簡単な方法は何ですか。これは、この質問のために短縮した非常に長い配列であることを覚えておいてください。

Array
(
    [0] => Array
        (
            [0] => Berlin
            [1] => 1
        )

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

    [2] => Array
        (
            [0] => New York
            [1] => 4
        )

    [3] => Array
        (
            [0] => Paris
            [1] => 5
        )

)
4

4 に答える 4

0

二分探索ロジックを使用して London と NewYork を検索し、削除して先頭に配置します。

$cityList=<the above array>;
$key="London";
$start=0;
$end=count($cityList);
$mid=($start+$end)/2;
while($end>=$start)
{
if($cityList[$mid][0]==$key)
{
    $keyForLondon=$mid;
    break;
}
elseif(strcmp($cityList[$mid][0],$key)<0)
    $start=$mid+1;
else
    $end=$mid-1;
$mid=($start+$end)/2;
}
$temp=$cityList[$mid];
unset($cityList[$mid]);
array_unshift($temp);
<Similar for New York>
$cityList=array_values(array_filter($cityList));
于 2012-07-05T09:38:43.687 に答える
0

お役に立てれば

$arrayCity; //your array
$newYork = null;
$london = null;
// Get London and New York and remove them
foreach ($arrayCity as $key => $item) {
    if ($item[0] == "New York") {
        $newYork = $item;
        unset($arrayCity[$key]);
    } elseif ($item[0] == "London") {
        $london = $item;
        unset($arrayCity[$key]);
    }
    // break if they were found
    if ($newYork && $london) {
        break;
    }
}
// Add them at the top
array_unshift($arrayCity, $newYork, $london);
于 2012-07-05T09:37:14.810 に答える
0

ゲットーソリューションの並べ替え:

$arrayCityIndex = array(); // Creating an array for sorting the keys while preserving index numbers.
$arrayNYLondonCityIndex = array();

foreach ($originalArray as $index => $cityArray) // Iterating through the original array.
{
    if ($cityArray[0] != 'New York' && $cityArray[0] != 'London') // Adding non NY and non London to array of indexes first.
    {
        $arrayCityIndex[$cityArray[0]] = $index; // Creates a City Name => Index Number hash.
    }
    else if ($cityArray[0] == 'New York' || $cityArray[0] = 'London')
    {
        $arrayNYLondonCityIndex[$cityArray[0]] = $index;
    }
}

ksort($arrayCityIndex); // Sort the index array by the key

$sortedArray = array();

foreach ($arrayNYLondonCityIndex as $cityName => $index) // Iterate through the hash of indexes and for each city in the hash, return the city's array in the original array (using the associated index number), and add it to the sorted array.
{
    $sortedArray[] = $originalArray[$index];
}

foreach ($arrayCityIndex as $cityName => $index)
{
    $sortedArray[] = $originalArray[$index];
}

var_dump($sortedArray);

ソリューションにアプローチするのは非常にハックな方法ですが、うまくいくはずです。

幸運を!

于 2012-07-05T09:37:30.067 に答える
0

usort()カスタム sort-function で組み込み関数を使用できます。

    // Input array
    $cities = array(
            array('Berlin', 1),
            array('London', 2),
            array('New York', 4),
            array('Paris', 5),
            array('Test', 12),
            array('Zzz', 3)
    );

    // Custom sort function
    function customFilter($a, $b)
    {
            static $firstEntries = array('New York', 'London');

            foreach ($firstEntries as $name)
            {
                    if ($a[0] == $name)
                            return -1;
                    if ($b[0] == $name)
                            return 1;
            }

            // Unprioritized : sort by name
            return strcmp($a[0], $b[0]);
    }

// Original array order
var_dump($cities);

// Filter and dump of the new array order
usort($cities, 'customFilter');
var_dump($cities);

$firstEntries配列はカスタマイズ可能で、定義された名前を優先します。

于 2012-07-05T09:58:38.000 に答える