2012-08-11 69 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