2012-08-11 59 views
2

我有以下功能正常工作。連接對象項目

function ($objects, $items = array()) 
{ 
    $result = array(); 
    foreach ($objects as $object) { 
    $result[$object->id] = $object->first_name . ' ' . $object->last_name; 
    } 
    return $result; 
} 

不過,我想在一個數組傳遞給$項,並有爆炸,所以我沒有指定FIRST_NAME和LAST_NAME手動。

如果$項目是隻有一個值(而不是數組),那麼這將是簡單的:

$result[$object->id] = $object->$item; 

但我不知道如何使這項工作,如果$項包含多個值和我想要加入他們的空間。像,下面的內容,但我需要獲得$對象中有

$items = array('first_name', 'last_name'); 
$result[$object->id] = implode(' ', $items); 
+0

那麼問題在哪裏? – 2012-08-11 22:16:52

+0

那麼,對於$ items中的每個值,每個$ result [$ object-> id]需要設置爲$ object-> item。 – JonoB 2012-08-11 23:30:01

回答

2

我是否知道你想使用$ item中的字符串作爲$ object的屬性名稱?

function ($objects, $items = array()) 
{ 
    $result = array(); 
    foreach ($objects as $object) { 
    $valuesToAssign = array(); 
    foreach ($items as $property) { 
     $valuesToAssign[] = $object->$property; 
    } 
    $result[$object->id] = implode(' ', $valuesToAssign); 
    } 
    return $result; 
} 

我不知道要避免第二個foreach,但是這會給你想要的結果。

+0

你爲什麼想要避免內在的foreach?使用兩個'foreach'來遍歷兩個數組沒有任何問題! – Eric 2012-08-12 09:54:56

+0

我個人不喜歡嵌套的foreach循環。我希望看到一個解決方案,其中$ items中的值可以動態使用,但最後你是對的。雖然我會重構內部的第二個函數。 – Jojo 2012-08-12 10:00:21

0

不知道如果我把你的權利,但這個怎麼樣:

function foo($objects, $items = array()) { 
    $result = array(); 
    $keys = array_flip($items); 

    foreach ($objects as $object) { 
     // Cast object to array, then omit all the stuff that is not in $items 
     $values = array_intersect_key((array) $object, $keys); 

     // Glue the pieces together 
     $result[$object->id] = implode(' ', $values); 
    } 

    return $result; 
} 

演示:http://codepad.viper-7.com/l8vmGr

+0

增加了問題的更多細節 – JonoB 2012-08-11 23:33:04

+0

@JonoB更新了代碼! – Niko 2012-08-12 09:29:57