【问题标题】:Sort PHP Array using a function parameter sort number使用函数参数排序号对 PHP 数组进行排序
【发布时间】:2016-02-06 07:04:00
【问题描述】:

我正在构建一个 PHP 函数来将 JavaScript 文件排入 PHP 数组,然后使用另一个 PHP 函数将所有 JS 文件加载到页面中,并根据可以传递到的排序号按顺序加载它们入队功能。类似于 WordPress 加载 JS 和 CSS 文件的方式。

所以我的 PHP 函数 enqueue_js_script() 可能如下所示,它接受 JS 文件的键名、JS 文件的文件路径和可选的排序顺序号。然后它将 JS 文件添加到 PHP 类属性 $this->_js_files[$script_key]...

public function enqueue_js_script($script_key, $file_source, $load_order = 0){
    $this->_js_scripts[$script_key] = $file_source;
}

然后我还会有一个 PHP 函数load_js_scripts(),它将每个脚本文件路径打印到网页 HTML 的标题中。

这是我要考虑传递给enqueue_js_script()$load_order 以根据这些数字按顺序将脚本打印到HTML 中的地方。

如何使用此排序顺序号对我的 JS 脚本数组进行排序?


更新

看起来我应该将排序号存储在这样的数组中......

    $this->_js_files[$script_key] = array(
      'file_source' => $file_source,
      'sort' => $load_order
    );

【问题讨论】:

  • 为了简化您的问题,您传入了一个键、一个值和一个排序顺序。您需要将值和排序顺序保存在对象中,并使用 usort php.net/manual/en/function.usort.php 编写自定义排序函数
  • $script_key 的目的是什么?可以将多个脚本文件分配给同一个$script_key吗?

标签: php arrays sorting


【解决方案1】:

使用 usort 和自定义排序功能:

<?php 
public function enqueue_js_script($script_key, $file_source, $load_order = 0){
    $jsScript = new \stdClass;
    $jsScript->load_order = $load_order;
    $jsScript->script_key = $script_key;
    $this->_js_scripts[$script_key] = $jsScript;
}

function sortJSFiles($a, $b)
{
    if ($a->load_order == $b->load_order) {
        return 0;
    }
    return ($a->load_order < $b->load_order) ? -1 : 1;
}


usort($this->_js_scripts, "sortJSFiles");

【讨论】:

    【解决方案2】:

    必须传递您的数组键并不是一个很好的做法。 $array[] = $foo 结构将$foo 添加为$array 的新最后一项。

    使用usort

    <?php
    class OrderStack {
        private $contents = array();
        public function add($order, $load) {
            if (!is_int($order) || $order < 0) {
                throw new InvalidArgumentException("$order must be a non-negative integer");
            }
            $this->contents[] = array($order, $load);
        }
        public function get_array() {
            usort(
                $this->contents,
                'OrderStack::compare'
            );
            return array_map(
                'OrderStack::get_load',
                $this->contents
            );
        }
        private static function get_load($stack_item) {
            return $stack_item[1];
        }
        private static function compare($a, $b) {
            return $a[0] - $b[0];
        }
    }
    
    class YourClass {
        private $_js_scripts;
        public function __construct() {
            $this->_js_scripts = new OrderStack();
        }
        public function enqueue_js_script($file_source, $load_order = 0) {
            $this->_js_scripts->add($load_order, $file_source);
        }
        public function get_js_scripts() {
            return $this->_js_scripts->get_array();
        }
    }
    ?>
    

    OrderStack 类是可重用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多