PHP:映射数组结果

时间:2015-05-21 07:53:32

标签: php arrays symfony

我从数据库中检索的结果包含一个带有汽车的数组($resultsCars)。每辆车的品牌都有一个ID。 Var_dumping数组导致以下结果:

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的新阵列并且已解决品牌ID,我尝试了以下代码:

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

但是,结果数组中的品牌字段包含布尔值false。我做错了什么?

3 个答案:

答案 0 :(得分:2)

您正在使用array_search,它将返回匹配的数组元素的索引,而不是元素本身。更重要的是,brands数组包含具有私有变量的对象,因此要访问它们,您必须具有getter函数,并且不能将它们作为数组访问。

例如,您无法执行此操作:

$arrData[0]['id']

如果对象变量是公共的,或者您正在使用StdClass,则可以像这样访问它们:

$arrData[0]->id

否则,您必须实现一个getter函数,然后您可以使用:

$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字符串。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

首先将$resultsMapped=[]声明更改为$resultsMapped=array();,然后更改

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;
 }

希望这能解决您的问题