为什么我的php数组在具有相同的密钥时被覆盖

时间:2010-12-03 04:56:35

标签: php

我有一个自定义PHP函数,它执行存储过程并返回一个数组:

function test(){
  $in      = array("abc","bcd","efg");
  $result  = mydba->executestoredprocedure('proc1',$in);
  $arr_sim = array();

  foreach ($result['recordset'] as $rows) {
    if (!empty($rows)) {
      echo $arr_sim[$rows['field1']] = $rows['field2'];
    }
  }

  return $arr_sim;
}

在上面的函数$arr_sim中,当rows["field1"]值不同时,正确返回项目数。如果rows["field1"]值相同则覆盖第一个值并仅返回最后一个值。我怎么能克服这个?

array ( [chicago] => 'sears', [rochester] => 'liberty' )

如果$arr_sim包含这些项目,则会正确返回。因为键是不同的。

array ( [chicago] => 'MCD', [chicago] => 'TACOBELL' )

如果$arr_sim包含这些项目,则无法正确返回。因为钥匙是相同的,“芝加哥”。

2 个答案:

答案 0 :(得分:1)

数组键必须是唯一的。相反,做这样的事情:

// You want the array to look like this
// array('chicago' => array('MCD', 'TACOBELL'));

function test(){
  $in  = array("abc","bcd","efg");
  $result = mydba->executestoredprocedure('proc1',$in);
 $arr_sim=array();
 foreach ($result['recordset'] as $rows) {
  if(!empty($rows)){
    if(array_key_exists($rows['field1'], $arr_sim) {
        $arr_sim[$rows['field1']][] = $rows['field2'];
    } else {
        $arr_sim[$rows['field1']] = array($rows['field2']);
    }
  }
 }
 return $arr_sim;
}

答案 1 :(得分:0)

$arr_sim[$rows['field1']] = $rows['field2']替换为$arr_sim[$rows['field1']][] = $rows['field2']。这将创建一个数组数组。

echo $arr_sim['chicago'][0]; // MCD
echo $arr_sim['chicago'][1]; // TACOBELL

从技术上讲,你应该写这样的东西以避免注意:

if (!isset($arr_sim[$rows['field1']])) $arr_sim[$rows['field1']] = array();
$arr_sim[$rows['field1']][] = $rows['field2'];

但你必须真的问自己,field1(城市名称)是否值得成为阵列的主键?如果没有,您应该选择其他标识符。