2011-12-14 38 views
6

Tôi đang cố gắng hoàn thành một bộ định tuyến URL mà tôi đã tạo cho khung MVC tùy chỉnh của mình. Tôi có một danh sách các tham số mà tôi đã tách ra khỏi URL, nhưng vấn đề là chúng chỉ có các phím số. Những gì tôi muốn làm là thiết lập nó để giá trị đầu tiên trong mảng $ params sẽ là KEY và sau đó giá trị thứ hai trong mảng là VALUE của KEY đầu tiên. Nhưng tôi cần phải vượt xa điều đó hơn nữa. Về cơ bản, tôi cần tất cả giá trị của khóa số lẻ trong mảng là KEY mới và giá trị của khóa số chẵn là giá trị.Sắp xếp lại một mảng: các mục nhập lẻ dưới dạng KEY, ngay cả các mục là VALUE

Ví dụ:

Đây là cách nó hiện được thiết lập:

Array 
(
    [0] => greeting 
    [1] => hello 
    [2] => question 
    [3] => how-are-you 
    [4] => response 
    [5] => im-fine 
) 

Đây là cách nó cần phải được (sau khi chuyển đổi):

Array 
(
    [greeting] => hello 
    [question] => how-are-you 
    [response] => im-fine 
) 

Nó sẽ được dễ dàng hơn để tạo ra loại mảng này khi tôi phát nổ chuỗi bằng dấu tách '/' khi tôi lấy nó ra khỏi chuỗi URL? Nếu có thì chức năng tốt nhất cho điều đó là gì?

Nó có lẽ là một giải pháp đơn giản, bởi vì tôi chắc chắn đây là một vấn đề phổ biến, nhưng bất kỳ sự giác ngộ nào?

+0

Tôi nghĩ rằng tôi đã sống với bạn cho đến khi bạn nói rằng bạn muốn chỉ mục đầu tiên (0) là khóa và sau đó bạn nói rằng bạn muốn các chỉ mục lẻ là khóa. Bạn có nghĩa là: bắt đầu từ số không, lấy giá trị đầu tiên là khóa, thứ hai là giá trị và đặt vào một bản đồ, và làm như vậy cho mỗi cặp khóa/giá trị? –

Trả lời

8

Có thể sử dụng array_splice() cho điều đó?

$result = array(); 

while (count($urls)) { 
    list($key,$value) = array_splice($urls, 0, 2); 
    $result[$key] = $value; 
} 

Điều này sẽ trích xuất hai mục đầu tiên từ danh sách URL và sử dụng chúng làm khóa và giá trị cho mảng kết quả. Lặp lại, cho đến khi danh sách nguồn trống.

+0

Tôi sẽ thử điều này ... Nếu có một số lượng không đồng đều các mục trong mảng, nó sẽ xuất một lỗi? – cshoffie

+1

@cshoffie yup, nó sẽ. Vì 'array_splice' sẽ sinh ra một mảng phần tử đơn, trong khi' list' mong đợi hai phần tử. Bạn sẽ nhận được 'Thông báo: Không xác định offset: 1 trong .... trên dòng ...' – Yoshi

1

Cái gì như:

$data = array (
    'greeting', 
    'hello', 
    'question', 
    'how-are-you', 
    'response', 
    'im-fine', 
); 

$new = array(); 

for ($i = 0, $lim = sizeof($data); $i < $lim; $i += 2) { 
    $new[$data[$i]] = isset($data[$i + 1]) ? $data[$i + 1] : null; 
} 

print_r($new); 
0

Tôi không biết nếu nó là giải pháp tốt nhất nhưng những gì tôi đã làm là

  $previousElement = null; 
      foreach ($features as $key => $feature) { 
       //check if key is even, otherwise it's odd 
       if ($key % 2 === 0) { 
        $features[$feature] = $feature; 
       } else { 
        $features[$previousElement] = $feature; 
       } 
       //saving element so I can "remember" it in next loop 
       $previousElement = $feature; 
       unset($features[$key]); 
      } 
0

Cách tốt nhất để làm điều đó là với chunking nó và sử dụng nó trong danh sách.

$array = array("greeting", "hello", "question", "how-are-you", "response", "im-fine"); 

$assoc = array(); 
    foreach (array_chunk($array, 2) as $pair) { 
    list($key, $value) = $pair; 
    $assoc[$key] = $value; 
} 

var_export($assoc); 

/* 
    array (
     'greeting' => 'hello', 
     'question' => 'how-are-you', 
     'response' => 'im-fine', 
) 
*/ 

found here

0

chỉ vì không ai khác đã chỉ ra, công trình này và ít nhất là tốt như việc xây dựng trong chức năng để thực hiện:

$array = array("greeting", "hello", "question", "how-are-you", "response", "im-fine"); 
$res = array(); 
for($i=0; $i < count($array); $i+=2){ 
    $res[$array[$i]] = $array[$i+1]; 
} 
Các vấn đề liên quan