2011-02-04 10 views
12

mảng của tôi:php mảng kết hợp để chìa khóa (không sắp xếp)

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

Bây giờ, với khi tôi lặp mảng, giá trị đầu tiên mà sẽ đưa ra có lẽ sẽ

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

phải không?

Nếu tôi muốn di chuyển dữ liệu $ [1] đến vị trí của $ data [0] thì sao?

Để nói lại:

Làm thế nào để làm cho các mảng giống như thế này (vì vậy đó là một 'đi lên tại $ data [0])

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

Tại sao tôi cần điều này?

Tôi sử dụng trình kích hoạt mã, bảng-> tạo hàm dựng sẵn nhận mảng assoc và tạo bảng nhưng không cung cấp phương thức sắp xếp các cột. Đây là lý do tại sao tôi muốn di chuyển các cột trong mảng nguồn.

+0

có thể trùng lặp của [? Sắp xếp một mảng bằng phím dựa trên mảng khác] (http : //stackoverflow.com/questions/348410/sort-an-array-by-keys-based-on-another-array) – iautomation

+0

@iautomation Câu hỏi không đề cập đến việc sử dụng mảng thứ hai để kiểm soát thứ tự đầu tiên.Họ yêu cầu một giải pháp để kiểm soát thứ tự của các khóa sau khi mảng đã được tạo ra. Sử dụng một mảng khác CÓ THỂ là một giải pháp có thể, nhưng nó không phải là một yếu tố hạn chế trong việc tìm kiếm các giải pháp cho câu hỏi này. – RedYetiCo

Trả lời

6

Hãy xem daniele centamore's comment trên chức năng array_splice() của PHP, trong đó ông cung cấp một vài hàm để di chuyển các phần tử trong mảng liên kết.

+0

Đã viết điều gì đó dựa trên nó, cảm ơn – nizzle

+4

Điều đó không thực sự trả lời câu hỏi. Ví dụ của Daniele không dành cho mảng kết hợp – Ben

+1

ksort ($ data); làm việc với tôi –

1

PHP có 13 functions for sorting arrays, theo khóa, theo giá trị, theo các hàm do người dùng xác định nơi bạn có thể chỉ định "một" xuất hiện trước "hai". Cũng có mảng array_shift, array_unshift, array_push và array_pop để di chuyển mọi thứ lên hoặc ra phía trước hoặc cuối mảng. Bạn có thể tạo một mảng hoàn toàn mới từ mảng hiện có.

+0

Tôi biết, các chức năng này rất tuyệt. Tuy nhiên, hãy chú ý cách nó nói 'Không sắp xếp' trong tiêu đề. Ngoài ra, tôi không thể tìm thấy hàm array_move_index ('một', 0); – nizzle

+6

Sắp xếp lại một tập hợp các mục * là * sắp xếp. Chỉ vì thứ tự của bạn không phải là từ điển hoặc số không có nghĩa là sắp xếp các mảng theo thứ tự đó không phải là sắp xếp. Đó là ý nghĩa của từ đó. –

+0

Exacly, bạn nên sử dụng usort và viết một đóng đơn giản. – loostro

-1

Tôi nghĩ rằng, bạn nên sử dụng asort chức năng: Các giải pháp

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

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

Run this code

+1

Điều này không sắp xếp theo khóa, nó sắp xếp theo giá trị! Xem tại đây: http://codepad.org/wUAsV5hr – oriadam

+0

Câu hỏi đặc biệt yêu cầu giải pháp không phân loại. – RedYetiCo

10

Hai càng tốt (không sử dụng array_splice):

1) Tạo một mảng mới với trật tự mới của phím.

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

2) Di chuyển các yếu tố one trả trước, loại bỏ nó khỏi $data và sao chép phần còn lại của mảng.

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

Xem ksortuksort.

Dưới đây là một ví dụ làm việc:

<?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); 
} 

Output:

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

Run này: http://codepad.org/yAK1b1IP