在PHP中对二维数组排序
不知是否有人能帮忙 我有一个二维数组,在eg中有许多工作项在PHP中对二维数组排序,php,arrays,Php,Arrays,不知是否有人能帮忙 我有一个二维数组,在eg中有许多工作项 $portfolioItems [$i] = array('job' => $extra_job->field_value, 'mediaType' => $media_type->field_value, 'default' => $default->field_value ); 我简化了数组以显示我试图排序的元素 基本上,这个列表最终会用缩略图/数据等填充我正在使用的jf
$portfolioItems [$i] = array('job' => $extra_job->field_value,
'mediaType' => $media_type->field_value, 'default' => $default->field_value
);
我简化了数组以显示我试图排序的元素
基本上,这个列表最终会用缩略图/数据等填充我正在使用的jfredcarousel
这一切都很好,但我想做的是有一个具体的顺序如下
如果媒体类型中有文本“hero”(仅为一个实例),则将其推到最前面
接下来的项目需要是一些已被标识为“默认”项目集的作业项目。因此,我可能会在某个地方设置一个标志,将作业编号标识为“默认”,并使用“英雄”流程进行检查
所以它将是“英雄”项目,然后作业编号项目定义为“默认”,其余项目将按顺序依次删除(我已经按照作业编号对项目进行了排序)
对现有二维数组进行排序的最佳方法是什么?我查看了shift/unshift等,但无法达到我想要的效果-我现在只想复制阵列,然后逐个检查这些条件,以使新阵列看起来正确。然后销毁旧阵列
有什么想法吗
谢谢使用并编写您自己的比较函数来体现您想要的规则
比如:
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');
大概是这样吧?:)
$finalItems=array();
对于($i=0;i 如果($modifiedPosition)欢呼——这只是一个问题,尽管uasort维护索引编号,但当我稍后通过此数组粘贴到XML文件时——它不会回到索引顺序吗?不,uasort的目的是排序(更改的顺序)数组。不要混淆索引和排序,因为它们并不总是一样的。如果你不需要维护索引关联,你可以使用usort
来代替。谢谢Dan-我会看看如何实现它。我说的对吗?因为这是一个二维数组,我需要在foreach中使用这个函数整个数组中的每个元素?例如uasort($portfolioItems[$count],'cmp');虽然没有测试它,只是告诉它是否不起作用,将尝试修复它。我更新了它,以前的显然不起作用,那一个应该起作用。嗨,很好,谢谢。最后我坚持了这个,因为订单仍然是原始的。ksort($finalItems);
$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]);
}
}
}
}