php中的数组排序有多种方式


Array sort in php with multiple ways

例如,我有两个数组阵列1:

Array(
    [id] => 50575
    [name] => Funbox - Pirates and Princesses
    [venue_id] => 3248
)

阵列2:

Array
(
    [0] => Array
        (
            [id] => 53295
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [1] => Array
        (
            [id] => 53323
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [2] => Array
        (
            [id] => 53391
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [3] => Array
        (
            [id] => 53402
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [4] => Array
        (
            [id] => 57130
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2980
        )
    [5] => Array
        (
            [id] => 57142
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )
    [6] => Array
        (
            [id] => 50575
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )
    [7] => Array
        (
            [id] => 50601
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )
    [8] => Array
        (
            [id] => 56113
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2882
        )
)

阵列1将是来自阵列2的任何一个子阵列,

现在我希望在数组2中,第一个数组应该是数组1,然后应该存在那些具有与数组1相同的场所id的子数组,然后是所有其他数组。如何进行排序?如果有英语错误的话,我很抱歉。

预期输出:

Array
    (
        [6] => Array
            (
                [id] => 50575
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 3248
            )
        [5] => Array
            (
                [id] => 57142
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 3248
            )
        [7] => Array
            (
                [id] => 50601
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 3248
            )
        [0] => Array
            (
                [id] => 53295
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2954
            )
        [1] => Array
            (
                [id] => 53323
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2954
            )
        [2] => Array
            (
                [id] => 53391
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2954
            )
        [3] => Array
            (
                [id] => 53402
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2954
            )
        [4] => Array
            (
                [id] => 57130
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2980
            )
        [8] => Array
            (
                [id] => 56113
                [name] => Funbox - Pirates and Princesses
                [venue_id] => 2882
            )
    )

这是一个自定义函数,应该做你想做的事:

 function sortArr($haystack, $needle){
        $out = array();
        foreach ($haystack as $index => $arr){
            if ($arr == $needle){
                $out["$index"] = $arr;
                unset ($haystack[$index]);
                break;
            } 
        }
        foreach ($haystack as $index => $arr){
            if ($arr['venue_id'] == $needle['venue_id']){
                $out["$index"] = $arr;
                unset($haystack[$index]);
            }
        }
        if (is_array($haystack)){
            return array_merge($out,$haystack);
        }
    }

以下是演示链接

您可以使用usort按照示例顺序对其进行排序。

function cmp($a, $b) {
  return $b["venue_id"] - $a["venue_id"];
}
usort($array2,"cmp"); 

所有这些都是按venue_id降序排序。因此,所有具有相同venue_id的数组都将被分组,最高的venue_id位于顶部。从你的回答中还不清楚你是否想要其他东西。

编辑:我对此进行了更多的思考,并提出了一个函数,该函数应该按照我的想法执行您的要求。它并不完美,但它应该起作用。

function customSort($array1,$array2) {
    global $primaryVenue_id;
    $primaryVenue_id = $array1["venue_id"];
    function cmp($a, $b) {
        global $primaryVenue_id;
        if ($a["venue_id"] == $primaryVenue_id) return -1;
        elseif ($b["venue_id"] == $primaryVenue_id) return 1;
        else return $b["venue_id"] - $a["venue_id"];
    }
    usort($array2, "cmp");
    unset($primaryVenue_id);
    return $array2;
}

基本上,如果您调用函数customSort($array1,$array2),那么它将返回$array2,所有子数组首先包含与$array1相同的venue_id,然后是id的降序。

您可以从第二个数组中取消设置匹配元素,然后使用函数array_unshift($array, $element);来预挂数组。

$needle = array(
  'id' => 50575,
  'name' => 'Funbox - Pirates and Princesses',
  'venue_id' => 3248
);
$stack = array(
  [0] => Array
        (
            [id] => 53295
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [1] => Array
        (
            [id] => 53323
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [2] => Array
        (
            [id] => 53391
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [3] => Array
        (
            [id] => 53402
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [4] => Array
        (
            [id] => 57130
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2980
        )
    [5] => Array
        (
            [id] => 57142
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )
    [6] => Array
        (
            [id] => 50575
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )
    [7] => Array
        (
            [id] => 50601
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )
    [8] => Array
        (
            [id] => 56113
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2882
        )
);
foreach ($stack as $k => $v) {
  if ($v['id'] == $needle['id']) {
    unset($stack[$k]);
    array_unshift($stack, $needle);
    break;
  } else {
    //echo 'No matching element in existing array.';
  }
}
print_r($testArray);

输出将是:

Array
(
    [0] => Array
        (
            [id] => 50575
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )
    [1] => Array
        (
            [id] => 53295
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [2] => Array
        (
            [id] => 53323
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [3] => Array
        (
            [id] => 53391
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [4] => Array
        (
            [id] => 53402
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2954
        )
    [5] => Array
        (
            [id] => 57130
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2980
        )
    [6] => Array
        (
            [id] => 57142
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )
    [7] => Array
        (
            [id] => 50601
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 3248
        )
    [8] => Array
        (
            [id] => 56113
            [name] => Funbox - Pirates and Princesses
            [venue_id] => 2882
        )
)