按值包含字符串部分的数组排序

时间:2016-03-15 20:24:49

标签: php jquery arrays sorting

我有一系列脚本

Array
(
    [0] => /js/ionslider/ion.rangeSlider.min.js
    [1] => /media/jquery/jQuery-2.1.4.min.js
    [2] => /media/bootstrap/js/bootstrap.min.js
    [3] => /widgets/wid_menu/js/menu.js
)

如何对此进行排序以获得结果:

Array
(
    [0] => /media/jquery/jQuery-2.1.4.min.js            
    [1] => /media/bootstrap/js/bootstrap.min.js
    [2] => /js/ionslider/ion.rangeSlider.min.js        
    [3] => /widgets/menu/js/menu.js
)

E.g将jQuery脚本和引导程序放在顶部。 P.SjQuery版本文件将来可能会更改。 谢谢!

4 个答案:

答案 0 :(得分:1)

你可以使用usort($ arr,“cmp”);并使用自定义排序功能。然后在该排序函数中,您可以使用正则表达式定义一个可满足您需求的preg_match,该表达式验证包含任何版本和“bootstrap”的“jquery”的字符串。

Sorting by Regex Groups in PHP

答案 1 :(得分:1)

您的排序方法中没有标准。也许你可以分类'元素在将它们添加到数组时,或实现依赖系统。

否则,您可以在数组中设置排序条件,即:

$patterns = [ '/media/jquery/', '/media/bootstrap/', '/js/'  ];

尊重您所需的排序顺序,然后您可以使用函数与usort一起使用,如下所示:

function scriptSort( $a, $b )
{
    $patterns = [ '/media/jquery/','/media/bootstrap/','/js/'  ];

    $keyA = $keyB = count( $patterns );
    foreach( $patterns as $key => $pattern )
    {
        if( strpos( $a, $pattern ) === 0 ) $keyA = $key;
        if( strpos( $b, $pattern ) === 0 ) $keyB = $key;
    }

    if( $keyA !== $keyB ) return $keyA - $keyB;
    else                  return $a > $b;
}

usort( $scripts, 'scriptSort' );

eval.in demo

在自定义函数中,首先我们将两个变量($keyA$keyB)设置为模式数组的总项,然后我们搜索路径模式是否匹配传递值 - 如果是 - 我们将$keyA/B设置为相应的数组键。最后,我们返回关键差异(在开始时我们设置为总计数,因此如果找不到密钥,$keyA/B值> gt;而不是找到的值),否则我们按字母顺序排序。

答案 2 :(得分:0)

Usort是个不错的选择。另一种方法是循环遍历脚本,一次一个地传输到新阵列。如果它们包含您要查找的其中一个字符串,请将它们推到新数组的开头,如果它们没有,则将它们推到最后。

foreach ($scripts as $script) {
    if (strpos($script, '/media/jquery') !== false 
        || strpos($script, '/media/bootstrap') !== false) {
        array_unshift($sorted_scripts, $script);             // add to beginning
    } else {
        $sorted_scripts[] = $script;                         // add to end
    }
}

答案 3 :(得分:0)

也许最好将其称为“重新排序”而不是“排序”

但是,有多种方法可以做到。

我刚刚编写了一个简单的:

$current = array(
    '/js/ionslider/ion.rangeSlider.min.js',
    '/media/jquery/jQuery-2.1.4.min.js',
    '/media/bootstrap/js/bootstrap.min.js',
    '/widgets/wid_menu/js/menu.js',
);

$priorities = array(
    'jquery',
    'bootstrap',
    'menu',
    );


function reorder($array, $priors){
    $result = array();
    foreach ($priors as $p) {
        $result = array_unique (array_merge ($result , preg_grep ('/'.$p.'/i', $array)));
    }

    return array_unique (array_merge ($result , $array));
}

echo '<pre>'.print_r(reorder($current,$priorities),true).'</pre>';