PHP: Сортировать рекурсивный массив по заданному массиву - PullRequest
0 голосов
/ 18 марта 2019

Мне нужно отсортировать массив:

$tableColumns=array(
            'icons'                         => '',
            'mailnickname'                  => t('Internal code'),
            'telephonenumberextension'      => t('Internal extension'),
            'sn'                            => t('Last name'),
            'givenname'                     => t('First name'),
            'cn'                            => t('Username'),
            'level'                         => t('Role'),
            'has_photo'                     => t('Photo'),
            'workspace_workplace'           => t('Workspace'),
            'workspace_layout'              => t('Officelayout'),
            'company'                       => t('Company'),
            'department'                    => t('Department'),
            'group'                         => t('Group'),
            'position'                      => t('Position'),
            'supervisor_name'               => t('Supervisor'),
            'description'                   => t('Description'),
            'mail'                          => t('Email'),
            'mobile'                        => t('Mobile'),
            'telephonenumber'               => t('Telephone'),
            'extensionattribute1'           => t('City'),
            'updated'                       => t('Synchronized')
        );

по этому порядку. Параметры:

$order_setup= array(
            'mailnickname',
            'telephonenumberextension',
            'sn',
            'givenname',
            'has_photo',
            'workspace_workplace',
            'company',
            'department',
            'group',
            'position',
            'supervisor_name',
            'mail',
            'mobile',
            'telephonenumber',
            'extensionattribute1',
        );

$tableColumns необходимо отсортировать по $order_setup.

Я пытаюсь что-то вроде этого, но не работает хорошо:

<code>$array_order = array_flip($tableColumns);

        usort($array_order, function ($a, $b) use ($order_setup) {
            $pos_a = array_search($a, $order_setup);
            $pos_b = array_search($b, $order_setup);
            return $pos_a - $pos_b;
        });

        $tableColumns_sorted = array();

        foreach($array_order as $o)
        {
            $tableColumns_sorted[$o]=$tableColumns[$o];
        }

        echo '<pre>', var_dump($tableColumns_sorted), '
';

Ответы [ 5 ]

3 голосов
/ 18 марта 2019

Расширенная версия версии @ evilReiko:

$newArray = [];
foreach ($order_setup as $field) {
    $newArray[$field] = $tableColumns[$field];
    unset($tableColumns[$field]);
}
$newArray = array_merge($newArray, $tableColumns);

Здесь вы unset обработали $tableColumns значений и после цикла - объедините остаток от $tableColumns до $newArray.

2 голосов
/ 18 марта 2019

Возможно, вы ищете array_intersect_key.Это автоматически фильтрует и упорядочивает элементы первого массива по ключам второго.array_flip меняет ключ и значение каждого элемента.

array_intersect_key($tableColumns, array_flip($order_setup))

Результат:

array (
  'mailnickname' => 'Internal code',
  'telephonenumberextension' => 'Internal extension',
  'sn' => 'Last name',
  'givenname' => 'First name',
  'has_photo' => 'Photo',
  'workspace_workplace' => 'Workspace',
  'company' => 'Company',
  'department' => 'Department',
  'group' => 'Group',
  'position' => 'Position',
  'supervisor_name' => 'Supervisor',
  'mail' => 'Email',
  'mobile' => 'Mobile',
  'telephonenumber' => 'Telephone',
  'extensionattribute1' => 'City',
)
2 голосов
/ 18 марта 2019
$tableColumnsSorted = [];
foreach($order_setup as $v) {
    $tableColumnsSorted[$v] = $tableColumns[$v];
}

Могут быть и другие способы сделать это, но приведенный выше код выполняет свою работу.

Обратите внимание, он не будет включать те, которые не входят в $order_setup.

0 голосов
/ 18 марта 2019

Как насчет этого?

    foreach($table_columns as $key => $value) {
        if(in_array($key, $order_setup)){
            $ordered_columns[$key] = $value;
        }
        else{
            $ordered_empty[$key] = null;
        }
    }

    print_r(array_merge($ordered_columns,$ordered_empty));
0 голосов
/ 18 марта 2019
$array_order = array_merge(array_flip($order_setup), $tableColumns);
//Or you can do this way
$array_order = array_replace(array_flip($order_setup), $tableColumns);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...