想知道是否有人可以提供帮助。
我有一个二维数组,其中有许多作业项目,例如;
$portfolioItems [$i] = array('job' => $extra_job->field_value,
'mediaType' => $media_type->field_value, 'default' => $default->field_value
);
我简化了数组以显示我正在尝试排序的元素。
基本上这个列表最终填充了我正在使用缩略图/数据等的jfredcarousel。
这一切都很好,但我想做的是具有如下特定顺序;
如果媒体类型中包含文本“hero”(只是一个实例),则将其向右推到前面。
然后,下一个项目需要是一些已被识别为“默认”项目的作业项目。所以我可能会在某个地方设置一个标志,将作业编号标识为“默认”,并检查“英雄”过程。
因此它将是'英雄'项目,然后将作业编号项目定义为'默认',其余部分将在此之后按顺序删除(我已经按作业编号对项目进行排序)。
对现有的二维数组进行排序的最佳方法是什么?我看了一下shift / unshift等但是无法达到我想要的效果 - 我现在正在考虑复制数组,然后逐个检查这些条件,这样新数组看起来正确。然后摧毁旧阵列。
赞赏任何想法
由于
答案 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]);
}
}
}
}