0

PHP 多维数组自定义排序。

排序应基于字段中的值[position] 一个人可以有多个职位(请参阅下面列出的特殊情况)。

Array
(
    [0] => Array
    (
        [position] => Array
            (
                [0] => Secretary
            )
    )
)

我希望数组按位置值排序为

  1. 秘书长
  2. 总统
  3. 司库
  4. 秘书
  5. 委员会成员

下面数组的特殊情况 ,它应该是第一个数组。因为这个人是“总书记”

[2] => Array
(
    [person_id] => 51136
    [position] => Array
        (
            [0] => General Secretary
            [1] => Committee Member
        )

    [person_name] => Person 1
)

示例输入数据

Array
(
    [0] => Array
    (
        [person_id] => 22180
        [position] => Array
            (
                [0] => Secretary
            )
        [person_name] => Person 1
    )

    [1] => Array
    (
        [person_id] => 51135
        [position] => Array
            (
                [0] => President
            )
        [person_name] => Person 2
    )

    [2] => Array
    (
        [person_id] => 51136
        [position] => Array
            (
                [0] => General Secretary
                [1] => Committee Member
            )

        [person_name] => Person 3
    )

    [3] => Array
    (
        [person_id] => 44141
        [position] => Array
            (
                [0] => Treasurer 
            )

        [person_name] => Person 4
    )

    [4] => Array
    (
        [person_id] => 51137
        [position] => Array
            (
                [0] => Committee Member
            )
        [person_name] => Person 5
    )
)

需要输出

Array
(
    [0] => Array
    (
        [person_id] => 51136
        [position] => Array
            (
                [0] => General Secretary
                [1] => Committee Member
            )

        [person_name] => Person 3
    )
    [1] => Array
    (
        [person_id] => 51135
        [position] => Array
            (
                [0] => President
            )
        [person_name] => Person 2
    )
    [2] => Array
    (
        [person_id] => 44141
        [position] => Array
            (
                [0] => Treasurer 
            )

        [person_name] => Person 4
    )
    [3] => Array
    (
        [person_id] => 22180
        [position] => Array
            (
                [0] => Secretary
            )
        [person_name] => Person 1
    )
    [4] => Array
    (
        [person_id] => 51137
        [position] => Array
            (
                [0] => Committee Member
            )
        [person_name] => Person 5
    )
)
4

2 回答 2

1

好吧,我把这个弄出来。

您仍然可以使用usort()而不是重新发明轮子。只是比较两个人的位置就好了array_search($position,$pos_array)

function sortByPosition($ps)
{
    $pos=array(0=>"General Secretary",1=>"President",2=>"Treasurer",3=>"Secretary",4=>"Committee Member");
    usort($ps,function($p1,$p2) use ($pos){
        $lvl1=count($pos);
        $lvl2=count($pos);
        foreach($p1["position"] as $position)
        {
            $lvl1=min(array_search($position,$pos),$lvl1);
        }
        foreach($p2["position"] as $position)
        {
            $lvl2=min(array_search($position,$pos),$lvl2);
        }
        return $lvl1-$lvl2;
    });
    return $ps;
}

测试:

$arr=Array(Array("person_id" => 22180,"position" => Array("Secretary"),"person_name" => "Person 1"), Array("person_id" => 51135,"position" => Array("President"),"person_name" => "Person 2"), Array("person_id" => 51136,"position" => Array("General Secretary","Committee Member"),"person_name" => "Person 3"), Array("person_id" => 44141,"position" => Array("Treasurer"),"person_name" => "Person 4"), Array("person_id" => 51137,"position" => Array("Committee Member"),"person_name" => "Person 5"));
print_r(sortByPosition($arr));

输出:

Array
(
    [0] => Array
        (
            [person_id] => 51136
            [position] => Array
                (
                    [0] => General Secretary
                    [1] => Committee Member
                )

            [person_name] => Person 3
        )

    [1] => Array
        (
            [person_id] => 51135
            [position] => Array
                (
                    [0] => President
                )

            [person_name] => Person 2
        )

    [2] => Array
        (
            [person_id] => 44141
            [position] => Array
                (
                    [0] => Treasurer
                )

            [person_name] => Person 4
        )

    [3] => Array
        (
            [person_id] => 22180
            [position] => Array
                (
                    [0] => Secretary
                )

            [person_name] => Person 1
        )

    [4] => Array
        (
            [person_id] => 51137
            [position] => Array
                (
                    [0] => Committee Member
                )

            [person_name] => Person 5
        )

)
于 2012-10-18T08:55:44.667 回答
0

您可以实现快速排序或任何其他排序算法,并确保比较发生在正确的变量上。

http://en.wikipedia.org/wiki/Quicksort

从 Wiipedias 伪代码中,您可以通过更改第 7 行来检查数组的位置参数。

function quicksort('array')
      if length('array') ≤ 1
          return 'array'  // an array of zero or one elements is already sorted
      select and remove a pivot value 'pivot' from 'array'
      create empty lists 'less' and 'greater'
      for each 'x' in 'array'
          if 'x' ≤ 'pivot' then append 'x' to 'less' // change to x['position'] and pivot['position']
          else append 'x' to 'greater'
      return concatenate(quicksort('less'), 'pivot', quicksort('greater')) // two recursive calls
于 2012-10-18T07:10:57.247 回答