【问题标题】:Sorting array in custom order按自定义顺序对数组进行排序
【发布时间】:2015-01-27 21:52:58
【问题描述】:

我需要以自定义方式对数组进行排序。目前数组是这样设置的:

array(3) {
  ["appetizer"]=>
  array(1) {
    ["slug"]=>
    string(9) "appetizer"
  }
  ["dessert"]=>
  array(1) {
    ["slug"]=>
    string(7) "dessert"
  }
  ["main"]=>
  array(1) {
    ["slug"]=>
    string(4) "main"
  }

我需要将数组的顺序从字母顺序(其当前顺序)更改为自定义顺序。

当前是这样的:app/dessert/main。 我需要它是应用程序/主/甜点。

不确定如何将数组更新为新的自定义顺序。我已经搞砸了uksort(),但并没有真正走得太远。

这里是生成当前数组及其顺序(按字母顺序)的 then 函数

function sort_dish_terms($term = array()){
    $tax = get_terms( $term ) ;
    $data = array();
    foreach ($tax as $t => $k) {
        // $name = $k->name;
        $slug = $k->slug;   
        $data[$slug] = array(
            'slug'  => $slug
        );  
    }
    return $data;
}

【问题讨论】:

  • Ummm... 使用什么标准来确定订单?你吃它们的顺序是什么?
  • 诚实的抽象标准。所需的排序顺序(应用/主/甜点)基于页面布局。

标签: php arrays wordpress sorting


【解决方案1】:

在我看来,这是一个更优雅的解决方案,仅使用 3 行来进行实际排序(或者,如果您愿意,也可以是其中之一)。使用 PHP 的uksort:

<?php

$priorities = array(
    "appetizer" => 1,
    "main"      => 2,
    "dessert"   => 3
);

$array = array(
    "appetizer" => array(
        "slug" => "appetizer"
    ),

    "dessert" => array(
        "slug" => "dessert"
    ),

    "main" => array(
        "slug" => "main"
    )
);

var_dump($array);

uksort($array, function($a, $b) use($priorities) {
    return $priorities[$a] > $priorities[$b];
});

var_dump($array);

?>

将导致:

array(3) {
  ["appetizer"]=>
  array(1) {
    ["slug"]=>
    string(9) "appetizer"
  }
  ["dessert"]=>
  array(1) {
    ["slug"]=>
    string(7) "dessert"
  }
  ["main"]=>
  array(1) {
    ["slug"]=>
    string(4) "main"
  }
}
array(3) {
  ["appetizer"]=>
  array(1) {
    ["slug"]=>
    string(9) "appetizer"
  }
  ["main"]=>
  array(1) {
    ["slug"]=>
    string(4) "main"
  }
  ["dessert"]=>
  array(1) {
    ["slug"]=>
    string(7) "dessert"
  }
}

工作示例:http://codepad.viper-7.com/OeMLhD

【讨论】:

    【解决方案2】:

    我会通过在生成数组之前确定所需的顺序来解决这个问题。类似于以下内容:

    $priorities = [
        'appetizer',
        'main',
        'dessert'
    ];
    
    /*
     * The $items array is generated by the function you provided.
     */
    $items = [
        'appetizer' => [
            'slug' => 'appetizer'
        ],
        'dessert' => [
            'slug' => 'dessert'
        ],
        'main' => [
            'slug' => 'main'
        ]
    ];
    

    然后我创建了一个可以在这种情况下使用的函数。

    function sort_by_priorities(array $priorities, array $items) {
    
        /*
         * Check if the two arrays are populated.
         */
        if(empty($priority) || empty($items)) {
            throw new LogicException('Parameters $priorities and $items cannot be empty.');
        }
    
        $sorted = [];
    
        /*
         * Ensure all array keys are lowercase for better comparison.
         */
        $items = array_change_key_case($items, CASE_LOWER);
    
        foreach($priorities as $priority) {
    
            $priority = strtolower($priority);
    
            if(array_key_exists($priority, $items)) {
    
                $sorted[$priority] = $items[$priority];
    
            }
    
        }
    
        return $sorted;
    
    }
    

    然后调用该函数,您应该会收到所需的订单。

    $sorted = sort_by_priorities($priorities, $items);
    

    这将使用var_dump() 提供如下数组:

    array (size=3)
      'appetizer' => 
        array (size=1)
          'slug' => string 'appetizer' (length=9)
      'main' => 
        array (size=1)
          'slug' => string 'main' (length=4)
      'dessert' => 
        array (size=1)
          'slug' => string 'dessert' (length=7)
    

    如果你愿意,这可以扩展。这个函数的当前版本不关心两个数组中是否有相同数量的数组元素,这对你可能有用也可能没用。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      因为您的第一级键都是已知的并且始终存在,所以只需翻转您的排序数组并将其值替换为实际值。

      代码:(Demo)

      $order = ['appetizer', 'main', 'dessert'];
      
      $items = [
          'appetizer' => ['slug' => 'appetizer'],
          'dessert' => ['slug' => 'dessert'],
          'main' => ['slug' => 'main']
      ];
      var_export(
          array_replace(array_flip($order), $items)
      );
      

      输出:

      array (
        'appetizer' => 
        array (
          'slug' => 'appetizer',
        ),
        'main' => 
        array (
          'slug' => 'main',
        ),
        'dessert' => 
        array (
          'slug' => 'dessert',
        ),
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 2012-06-02
        • 2014-04-01
        • 2021-12-01
        相关资源
        最近更新 更多