PHP按字母顺序排序数组,除了顶部的一个值,下拉菜单

时间:2014-04-01 16:18:27

标签: php arrays sorting oscommerce usort

我正试图破解一个下拉菜单,从一系列国家/地区提取信息,以便美国' (id 1)显示在顶部,而其他所有国家/地区按字母顺序排序。如何使用usort函数对数组中的所有EXCEPT美国进行排序?我们也欢迎任何其他建议。这是代码:

while (list($key, $value) = each($countries->countries)) {
   $countries_array[] = array('id' => $key, 'text' => $value['countryname']);
}
function text_cmp($a, $b) {
   return strcmp($a["text"], $b["text"]);
} 
usort($countries_array, 'text_cmp'); 

3 个答案:

答案 0 :(得分:1)

最简单的方法是删除单个值,排序然后重新添加它:

working example

// your countries array goes here:
$countries = array(2=>"Burma", 4=>"Zimbabwe", 10=>"France", 1=>"United States", 13=>"Russia");

$AmericaFKYeah = array(1=>"United States");
$countries =array_diff($countries, $AmericaFKYeah);
asort($countries);

// using + instead of array_unshift() preserves numerical keys!
$countries= $AmericaFKYeah + $countries;

给你:

array(5) {
  [1]=>
  string(13) "United States"
  [2]=>
  string(5) "Burma"
  [10]=>
  string(6) "France"
  [13]=>
  string(6) "Russia"
  [4]=>
  string(8) "Zimbabwe"
}

答案 1 :(得分:1)

使用索引数组

<强>步骤

  1. 在数组中查找资源
  2. 数组中未设置的变量
  3. 使用array_unshift添加资源作为数组中的第一个元素(array_unshift - 将一个或多个元素添加到数组的开头 - http://php.net/manual/en/function.array-unshift.php
  4. <强>代码

     if (in_array('yourResource', $a_array)){
        unset($a_array[array_search('yourResource',$a_array)]);
        array_unshift($a_array, 'yourResource');
     }
    

    使用MultiDimensional Arrays

    $yourResorceToFind = 'yourResource';
    foreach ($a_arrays as $a_sub_array){
      if (in_array($yourResorceToFind, $a_sub_array)){
    
        unset($a_arrays[array_search($yourResorceToFind,$a_sub_array)]);
        array_unshift($a_arrays, $a_sub_array);
        break;
      }
    }
    

答案 2 :(得分:0)

我发现这个主题试图以丑陋的方式做同样的事情,但是由于我的技术看起来更简单,所以如果有人需要,我可以分享它。

最简单的方法是摆弄usort回调的结果。您只需要像这样在回调中首先传递想要的值即可:

$countries = [
 ['id' => 2, 'text' => 'Burma'],
 ['id' => 4, 'text' => 'Zimbabwe'],
 ['id' => 10, 'text' => 'France'],
 ['id' => 1, 'text' => 'United States'],
 ['id' => 13, 'text' => 'Russia'],
];

$myFirstItem = "United States";

usort($countries, function($a, $b) use ($myFirstItem) {
    return $myFirstItem == $a['text'] ? -1 : ($myFirstItem == $b['text'] ? 1 : strcmp($a['text'], $b['text']));
});

这有点丑陋,但不需要其他数组就可以完成工作,并且一切都在回调中完成了。