【问题标题】:Sorting arrays by key number PHP按键号 PHP 对数组进行排序
【发布时间】:2014-06-11 11:19:20
【问题描述】:

我需要对一些数组进行排序,其中键是产品的价格。我用过ksortkrsort,一切都按预期工作。问题是当键的数量超过一个数字时,它就不能正确排序。

数组示例:

$array = array(
 '11,45' => 'product1',
 '8,91' => 'product2',
 '12,14' => 'product3',
 '9,54' => 'product4
);

我得到的升序结果:

11,45 - 12,14 - 8,91 - 9,54

升序所需的结果:

8,91 - 9,54 - 11,45 - 12,14 

【问题讨论】:

  • 8,91 被视为字符串而不是 int,您必须使用 8.91,因此根据字母顺序 1 大于 8
  • 我只在示例中使用逗号,在我的代码中我有 .而且它没有正确订购。
  • 尝试将 5.6 和 51.0 添加到它们以查看它们将如何排序。因为它仍然有可能被读取为字符串。如果是结果将变为11,45 - 12,14 - 51.0 - 5.6 - 8.91 - 9.54 几乎检查排序是否真的按字母顺序排序

标签: php arrays sorting


【解决方案1】:

ksort 函数与SORT_NUMERIC 标志一起使用:

ksort($array, SORT_NUMERIC);

【讨论】:

    【解决方案2】:

    这个简单而简短的解决方案可能会对您有所帮助。

    $array = array(
     '11.45' => 'product1',
     '8.91' => 'product2',
     '12.14' => 'product3',
     '9.54' => 'product4'
    );
    
    $array=array_flip($array); //flip key and values
    asort($array); //sort values low to high
    $array=array_flip($array); //flip the key and values again
    print_r($array);
    

    【讨论】:

      【解决方案3】:

      这个函数可以解决问题;它基于拆分逗号之前的内容。

      function array_sort($arr){
      if(is_array($arr)){
          $numeric = array();
          $string = array();
          foreach($arr as $k => $v)
          {
              if(isset($v["meta_value"])){
                   $str = explode(" ",trim($v["meta_value"]));
                   $firstWord  = explode(",",trim($str[0]));
               }else{
                   $str = $v;
                   $firstWord  = explode(",",trim($str));
               }
      
              $firstWord = $firstWord[0];
      
              if(is_numeric($firstWord))
              {
                  $numeric[(int)$firstWord] = $v;
              }else{
                  $string[$firstWord] = $v;
              }
              unset($firstWord);
          }
          ksort($string,SORT_STRING);
          ksort($numeric,SORT_NUMERIC);
      
          return array_merge((array)$string, (array)$numeric);
      }
      return false;
      }
      

      用法:

      $meta =get_post_meta($post_id,$meta_key);
      $sorted = array_sort($meta);
      

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-19
        相关资源
        最近更新 更多