【问题标题】:Sorting array by value containing the part of string [closed]按包含字符串部分的值对数组进行排序[关闭]
【发布时间】:2016-07-01 11:48:06
【问题描述】:

我有一个脚本数组

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
)

例如,将 jQuery 脚本和引导程序放在顶部。 P.S jQuery 版本文件将来可能会更改。 谢谢!

【问题讨论】:

  • 呃……随机顺序?这些是如何排序的?
  • 那不是以任何方式排序的。你只希望jQuery*bootstrap* 成为第一。
  • 包含 what 字符串的一部分?
  • /media/jquery/ 和 /media/bootstrap/
  • 你的问题很模糊。这看起来像 PHP 中的数组。您是否使用管理前端资产的框架?如果您在问题中添加尽可能多的细节,这可能会很有用。

标签: php jquery arrays sorting


【解决方案1】:

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

Sorting by Regex Groups in PHP

【讨论】:

    【解决方案2】:

    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】:

      您的排序方法没有标准。也许您可以在将元素添加到数组时对元素进行“分类”,或者实现依赖系统。

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

      $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到对应的数组键。最后,我们返回key的差异(一开始我们设置为total count,所以如果没有找到key,则$keyA/B的值大于找到的值),否则我们按字母排序。

      【讨论】:

      • 谢谢。但是在您的解决方案中,我发现了错误。因为 /media/bootstrap/ 将被放置在阵列的顶部。我正在寻找先放置jQuery的方法。
      • @user889349 仔细检查您的代码。在demo '/media/jquery/' 位于顶部。顺序为$pattern数组的顺序。
      【解决方案4】:

      也许称它为“重新排序”而不是“排序”更好

      但是,您可以通过多种方式进行操作。

      我只是编了一个简单的:

      $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>';
      

      【讨论】:

        猜你喜欢
        • 2011-07-23
        • 2014-05-05
        • 2020-02-18
        • 2015-08-07
        • 2019-05-26
        • 2011-03-07
        • 1970-01-01
        • 2015-08-06
        相关资源
        最近更新 更多