在PHP中对2维数组进行排序

时间:2011-01-26 09:46:05

标签: php arrays

想知道是否有人可以提供帮助。

我有一个二维数组,其中有许多作业项目,例如;

$portfolioItems [$i] = array('job' => $extra_job->field_value,
      'mediaType' => $media_type->field_value, 'default' => $default->field_value
      );

我简化了数组以显示我正在尝试排序的元素。

基本上这个列表最终填充了我正在使用缩略图/数据等的jfredcarousel。

这一切都很好,但我想做的是具有如下特定顺序;

如果媒体类型中包含文本“hero”(只是一个实例),则将其向右推到前面。

然后,下一个项目需要是一些已被识别为“默认”项目的作业项目。所以我可能会在某个地方设置一个标志,将作业编号标识为“默认”,并检查“英雄”过程。

因此它将是'英雄'项目,然后将作业编号项目定义为'默认',其余部分将在此之后按顺序删除(我已经按作业编号对项目进行排序)。

对现有的二维数组进行排序的最佳方法是什么?我看了一下shift / unshift等但是无法达到我想要的效果 - 我现在正在考虑复制数组,然后逐个检查这些条件,这样新数组看起来正确。然后摧毁旧阵列。

赞赏任何想法

由于

2 个答案:

答案 0 :(得分:2)

使用uasort并编写自己的比较函数,该函数体现了您想要的规则。

类似的东西:

function cmp($a, $b) {
    if (strpos($a['mediaType'], 'hero') !== false && strpos($b['mediaType'], 'hero') === false) {
        return 1;
    } else if (strpos($a['mediaType'], 'hero') === false && strpos($b['mediaType'], 'hero') !== false) {
        return -1;
    } else if ($a['default'] == 1 && $b['default'] != 1) {
        return 1;
    } else if ($a['default'] != 1 && $b['default'] == 1) {
        return -1;
    } else {
        return 1;
    }
}

uasort($portfolioItems, 'cmp');

答案 1 :(得分:0)

这样的事可能吗? :)

$finalItems = array();

for($i = 0; i < count($portfolioItems); $i++){
       if($portfolioItems[$i]['media_type'] == 'hero'){
         reindex($finalItems, 0);
         $finalItems[0] = $portfolioItems[$i];
       }
       else if($portfolioItems[$i]['default'] == true){
         reindex($finalItems, 1);
         $finalItems[1] = $portfolioItems[$i];
       }

       else {
            if($i != 0 && $i != 1){
                  reindex($finalItems, $i);
                  $finalItems[$i] = $portfolioItems[$i];
            }
       }
}

function reindex(&$arr, $modifiedPosition){

 for($i = 0; $i < count($arr); $i++){
  if($modifiedPosition <= $i){
   $arr[$i+1] = $arr[$i]; 

    if($i == $modifiedPosition){
     unset($arr[$i]);
    }

  }

 }

}