Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中对二维数组排序_Php_Arrays - Fatal编程技术网

在PHP中对二维数组排序

在PHP中对二维数组排序,php,arrays,Php,Arrays,不知是否有人能帮忙 我有一个二维数组,在eg中有许多工作项 $portfolioItems [$i] = array('job' => $extra_job->field_value, 'mediaType' => $media_type->field_value, 'default' => $default->field_value ); 我简化了数组以显示我试图排序的元素 基本上,这个列表最终会用缩略图/数据等填充我正在使用的jf

不知是否有人能帮忙

我有一个二维数组,在eg中有许多工作项

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

  }

 }

}