2011-01-26 90 views
0

不知道有没有人可以帮忙。在PHP中对二维数组排序

我有一个二维数组,其中有一些工作项目在例如;

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

我简化了数组以显示我想要排序的元素。

基本上这个名单最终填充我使用的是缩略图/数据等

这一切工作正常,但我想要做的是有一个特定的顺序如下jfredcarousel;

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

然后,下一个项目需要是一些已被确定为“默认”项目集的作业项目。所以我可能会在某个地方设置一个标志,将工作号码标识为“默认”,然后像“英雄”进程一样进行检查。

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

什么是最好的方式去排序一个现存的二维数组?我看了一下shift/unshift等,但无法达到我想要的 - 我现在只是在复制数组,然后逐个检查这些条件,以便新数组看起来正确。然后摧毁旧的阵列。

任何想法赞赏

感谢

回答

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]); 
    } 

    } 

} 

} 
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'); 
+0

干杯 - 只是一个问题,虽然与uasort维护索引号,当我通过这个数组的foreach后来坚持到XML文件 - 那会不会回到索引顺序? – frazzle 2011-01-26 09:55:54

+2

不,uasort的目的是对数组进行排序(改变顺序)。不要将索引与排序混淆,因为它们并不总是相同的。不过,如果你不需要维护索引关联,你可以使用`usort`。 – 2011-01-26 09:57:42