2011-02-04 2 views
12

Мой массив:PHP порядок ключей ассоциативного массива (без сортировки)

$data = array('two' => 2, 'one' => 1, 'three' => 3); 

Теперь, когда я итерацию массива, первое значение, которое придумает, вероятно, будет

$data['two'] // = 2 @ index[0] 

правильно?

Что делать, если я хочу переместить $ data [1] в позицию $ data [0]?

Перефразируя:

Как сделать массив выглядеть следующим образом (так, что «один» приходит на $ данных [0])

$data = array('one' => 1, 'two' => 2, 'three' => 3 

Зачем мне это нужно?

Я использую воспламенитель кода, таблица-> генерировать встроенную функцию принимает массив-символ и создает таблицу, но не предлагает метод размещения столбцов. Вот почему я хотел бы переместить столбцы в исходном массиве.

+0

Возможный дубликат [? Сортирует массив по ключам на основе другого массива] (HTTP : //stackoverflow.com/questions/348410/sort-an-array-by-keys-based-on-another-array) – iautomation

+0

@iautomation В вопросе не упоминалось использование второй массив для управления порядком первого.Они попросили решение для управления порядком ключей после создания массива. Использование другого массива МОЖЕТ быть одним из возможных решений, но это не должно быть ограничивающим фактором при поиске решений для этого вопроса. – RedYetiCo

ответ

6

Посмотрите на daniele centamore's comment на функцию PHP array_splice(), где он предоставляет пару функций для перемещения элементов в ассоциативном массиве.

+0

Написал что-то основанное на нем, спасибо – nizzle

+4

Это на самом деле не отвечает на вопрос. Пример Даниэле не для ассоциативных массивов – Ben

+1

ksort ($ data); работает со мной –

1

PHP имеет 13 functions for sorting arrays, по ключу, по значению, определяемыми пользователем функциями, где вы можете указать, что «один» предшествует «двум». Также есть array_shift, array_unshift, array_push и array_pop для перемещения вещей на фронт или конец массива. Вы можете построить целый новый массив из существующего.

+0

Я знаю, эти функции великолепны. Однако обратите внимание на то, как в заголовке указано «Не сортировать». Кроме того, я не мог найти функцию array_move_index ('one', 0); – nizzle

+6

Реорганизация набора элементов * * сортировка. Просто потому, что ваш заказ не является лексикографическим или числовым, не означает, что упорядочивание массивов в этом порядке не сортирует. Это самый смысл этого слова. –

+0

Exacly, вы должны использовать usort и написать простое закрытие. – loostro

-1

Я думаю, вы должны использовать asort функции:

$data = array('two' => 2, 'one' => 1, 'three' => 3); 

$dataOrdered = $data; 
asort($dataOrdered); 

Run this code

+1

Это не сортирует по ключам, он сортируется по значению! См. Здесь: http://codepad.org/wUAsV5hr – oriadam

+0

Вопрос специально запросил решение без сортировки. – RedYetiCo

10

Два возможного решение (без использования array_splice):

1) Создать новый массив с новым порядком из ключи.

$new_keys = array('one', 'two', 'three'); 
$new_data = array(); 
foreach ($new_keys as $key) { 
    $new_data[$key] = $data[$key]; 
} 
$data = $new_data; 

2) Переместить элемент one авансом, удалить его из $data и скопировать остальную часть массива.

function rearrangeData($data) { 
    $result['one'] = $data['one']; 
    unset($data['one']); 
    return array_merge($result, $data); 
}  
$data = rearrangeData($data); 
1

См ksort и uksort.

Вот рабочий пример:

<?php 

$data = array('two' => 2, 'one' => 1, 'three' => 3); 
print_r($data); 
ksort($data); 
print_r($data); 
uksort($data,'cmp'); 
print_r($data); 
function cmp($a, $b) 
{ 
    $num=' one two three four five six seven eight nine ten'; 
    $ai = stripos($num,$a); 
    $bi = stripos($num,$b); 
    if ($ai>0 && $bi>0) { 
     return ($ai > $bi) ? 1 : -1; 
    } 
    return strcasecmp($a, $b); 
} 

Выход:

Array 
(
    [two] => 2 
    [one] => 1 
    [three] => 3 
) 
Array 
(
    [one] => 1 
    [three] => 3 
    [two] => 2 
) 
Array 
(
    [one] => 1 
    [two] => 2 
    [three] => 3 
) 

Выполнить это: http://codepad.org/yAK1b1IP

Смежные вопросы