使用函数参数排序号对 PHP 数组进行排序


Sort PHP Array using a function parameter sort number

我正在构建一个PHP函数,将JavaScript文件排队到PHP数组中,然后使用另一个PHP函数,该函数将所有JS文件加载到页面中,并根据可以传递到enqueue函数中的排序号按顺序加载它们。 类似于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 
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");

必须传递数组密钥并不是很好的做法。$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();
    }
}
?>

类是可重用的。