按子阵列类型值排序,然后按字母顺序排序

时间:2017-11-16 18:59:29

标签: php arrays sorting

我有一个看起来像这样的数组:

$array = [
    'field1' => [
        '#type' => 'text',
        '#label' => 'Field 11',
    ],
    'field4' => [
        '#type' => 'fieldset',
        '#label' => 'Field 4',
    ],
    'field12' => [
        '#type' => 'text',
        '#label' => 'Field 12',
    ],
    'field3' => [
        '#type' => 'fieldset',
        '#label' => 'Field 3',
    ],
    'field18' => [
        '#type' => 'text',
        '#label' => 'Field 18',
    ],
];

我想以这样的方式对这个数组进行排序,其中fieldset类型的所有字段都在底部。同时,我希望文本字段(位于顶部)按#label按字母顺序排序,字段集(应位于底部)也应按标签的字母顺序排序。这是我到目前为止所做的。

ksort($array);
uasort($array, function($field1) {
    if ($field1['#type'] !== 'fieldset') {
        return 0;
    }
    return 1;
});

按键值对数组进行排序成功按字母顺序对整个数组进行排序。但是,一旦我添加uasort,虽然我的fieldset位于底部,但字母顺序不再存在。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

使用具有2个条件的usort

 usort($array, function ($i1, $i2) { 
                 // compare types 
                 $r = ($i1['#type'] == 'fieldset' ? 1 : 0) -  ($i2['#type'] == 'fieldset' ? 1 : 0); 
                 // if both are (or not) fieldset (r == 0), compare labels
                 return $r ? $r : strcmp($i1['#label'], $i2['#label']);  } );

答案 1 :(得分:1)

我会使用UPDATE Dtable d INNER JOIN Rtable r ON d.key = r.key SET d.value = r.value, r.value = 0 WHERE d.key = 403 AND d.value = 0 AND r.id = 403 。如果您只有array_multisortfieldset

,则会按要求排序
text

将所有array_multisort(array_column($array, '#type'), SORT_DESC, array_column($array, '#label'), SORT_ASC, $array); 值提取为数组排序降序,并将所有#type值提取到升序的数组中,对原始值进行排序。