2015-05-21 122 views
0

从我的数据库中检索到的结果包含一个包含汽车的数组($resultsCars)。每辆车的品牌都有一个ID。 Var_dumping阵列的结果如下:PHP:映射数组结果

array(2) { 
    [0]=> 
    array(2) { 
    ["brand"]=> 
    string(36) "2cb4c4d6-b706-e411-8ed9-0050568c4808" 
    ["color"]=> 
    string(5) "black" 
    } 
    [1]=> 
    array(2) { 
    ["brand"]=> 
    string(36) "2cb4c4d6-b706-e411-8ed9-0050568c4807" 
    ["color"]=> 
    string(5) "white" 
    } 
} 

我的目标是用品牌的实际名称替换id。为了实现这一点,我将使用一个数组,将每个id映射到相应的汽车名称。 Var_dumping这个阵列($arrData)结果为以下:

array(3) { 
    [0]=> 
    object(some\path\here)#697 (2) { 
    ["id":"some\path\here":private]=> 
    string(36) "2cb4c4d6-b706-e411-8ed9-0050568c4806" 
    ["name":"some\path\here":private]=> 
    string(4) "Audi" 
    } 
[1]=> 
    object(some\path\here)#697 (2) { 
    ["id":"some\path\here":private]=> 
    string(36) "2cb4c4d6-b706-e411-8ed9-0050568c4807" 
    ["name":"some\path\here":private]=> 
    string(8) "Mercedes" 
    } 
    [2]=> 
    object(some\path\here)#697 (2) { 
    ["id":"some\path\here":private]=> 
    string(36) "2cb4c4d6-b706-e411-8ed9-0050568c4808" 
    ["name":"some\path\here":private]=> 
    string(3) "BMW" 
    } 
} 

为了创建基于$resultsCars,并与品牌标识解决的新阵,我曾尝试下面的代码:

$resultsMapped = []; 
foreach ($resultsCars as $result) { 
    $result['brand'] = array_search($result['brand'], $arrData); 
    $resultsMapped[] = $result; 
} 

品牌领域但是在结果数组中,包含布尔值false。我究竟做错了什么?

+0

问题是'$ arrData'包含的对象(包含你的值)而不是直接包含这些值。我认为array_search不能像这样查看对象。此外,在你的对象中'id'和'name'是'private',你可能不得不使用getter来检查值...可能必须使用自定义函数来搜索'$ arrData' – Random

+0

我没有看到品牌姓名存在于阵列中 –

+0

@karvin。开发者的品牌是'2cb4c4d6-b706-e411-8ed9-0050568c4806',并在$ arrData中加入'id' – Random

回答

0

更改第一行$ resultsMapped = [];到$ resultsMapped = array(); ..

+0

这些是等价的。 – Erik

0

首先更改$resultsMapped=[] declartion到​​然后更改

foreach ($resultsCars as $result) { 
    $result['brand'] = array_search($result['brand'], $arrData); 
    $resultsMapped[] = $result; 
} 

foreach ($resultsCars as $result) { 
    $result['brand'] = array_search($result['id'], $arrData); 
    $resultsMapped[] = $result; 
} 

希望这将解决您的问题

+0

$ result没有索引'id','$ arrData'没有... – Random

+0

这只是一个派生描述,使您能够理解哪些值需要放置在适当的键和值上,因为我们根据总数假设 –

2

您正在使用array_search,这将返回指数匹配的数组元素,而不是元素本身。更有甚者,品牌数组包含对象和私有变量,因此要访问它们,您必须具有getter函数,并且不能以数组的形式访问它们。

例如,您不能做到这一点:

$arrData[0]['id'] 

如果对象变量将是公共的,或者你正在使用一个StdClass你可以像这样访问他们:

$arrData[0]->id 

否则,您必须实施吸气功能,然后才能使用:

$arrData[0]->getId() 

您可以使用array_map函数将元素从一个阵列映射到另一个阵列。使用array_map,您可以使用将品牌映射到汽车的回调函数。

例如,如果你有一个getter函数:

$arrData = [...] // Contains the brands array 
$func = function($car) { 
    foreach ($arrData as $brand) { 
     if ($car['brand'] === $brand->getId()) { 
      $car['brand'] = $brand; break; 
     } 
    } 
    return $car; 
}; 
array_map($func, $resultsCars); 

之后,您的$ resultsCars阵列将有品牌ID字符串的品牌对象instend。