2013-07-03 35 views
7

Tôi có một phương thức trong một lớp trông như thế này;Phân loại PHP mảng_intersect_key() kết quả theo mảng thứ hai

class SomeClass { 
    private $hidden = array(....); 

    /** 
    * @return array - numeric indexed array in order of $this->hidden. 
    * Suitable for use by list(var1, var2, ...) 
    */ 
    public function getAsList($list = array()) 
    { 
     return array_values(array_intersect_key($this->hidden, array_flip($list)); 
    } 

Nhưng điều này không hữu ích, vì người gọi phương thức không biết thứ tự của cặp khóa/phần tử trong mảng kết hợp trong biến mẫu $ hidden. Lý tưởng nhất, mảng được trả về sẽ theo thứ tự chính xác như các khóa được chỉ định trong danh sách $. Ví dụ:

$foo = new SomeClass(); 
list($foo, $bar, $baz) = $foo->getAsList(array('foo', 'bar', 'baz'); 

Tôi có thể dễ dàng viết một số mã PHP rõ ràng, dài dòng để làm điều này, nhưng có cách thông minh để sử dụng các chức năng mảng khác nhau, ví dụ: array_multisort() để nhổ ra điều này trong các dòng mã tối thiểu (và hy vọng, ở tốc độ mã được biên dịch - tôi sẽ kiểm tra nó, nếu nó quan trọng).

Trong ý nghĩa, đây là một lời trêu ghẹo não mà tôi chưa biết câu trả lời. Nó không quan trọng tôi làm điều đó mà không có một vòng lặp rõ ràng, nhưng tôi tò mò muốn nếu nó có thể được thực hiện. Tôi đã dành 30 phút trên đó và chưa tìm được giải pháp nào.

+0

+1 nguyên nhân tôi thích những câu hỏi, nhưng tôi cũng muốn đảm bảo rằng bạn nhận biết 'extract()'. – goat

+0

Tôi biết về trích xuất(). Tôi đang cố gắng để tránh nó trong lớp của tôi mà có phương pháp này, vì nó rất dễ dàng để gây ra vấn đề an ninh nếu extract() được sử dụng sai. Ngoài ra, tôi đã phát hiện ra rằng việc tạo một cách rõ ràng các biến được đặt tên của tôi thực sự nhanh hơn trích xuất() vì một số lý do - ít nhất là trong tập hợp các điểm chuẩn nhỏ của tôi. – CXJ

Trả lời

7

lẽ array_replace là mảnh còn thiếu để đố bạn:

public function getAsList($list = array()) 
{ 
    $klist = array_flip($list); 
    return array_values(array_intersect_key(array_replace($klist, $this->hidden), $klist)); 
} 

Ví dụ (Demo):

$hidden = [ 
    'apples' => 19, 
    'eggs' => 7, 
    'grapes' => 144, 
    'mushrooms' => 3, 
    'oranges' => 16 
]; 

$list = ['grapes', 'apples', 'eggs', 'oranges']; 

$klist = array_flip($list); 
print_r(array_values(array_intersect_key(array_replace($klist, $hidden), $klist))); 

/* 
Array 
(
    [0] => 144 
    [1] => 19 
    [2] => 7 
    [3] => 16 
) 
*/ 
Các vấn đề liên quan