想象一下我有一个数据数组。其中的每个项目都是另一个数组,包含"id"、"link"和"display":
$travel = array(
array(
'id' => 1,
'link' => 'bus',
'display' => 'bus'
),
array(
'id' => 2,
'link' => 'bike',
'display' => 'bicycle'
),
array(
'id' => 3,
'link' => 'cart',
'display' => 'horse and cart'
)
);
要通过已知id($id
)显示"显示",我需要做以下操作:
foreach($travel as $t) {
if($t['id'] == $id) {
echo $t['display'];
break; // uuurgh, nasty...
}
}
同样,要通过已知链接($link
)显示"显示",我也需要这样做:
foreach($travel as $t) {
if($t['link'] == $link) {
echo $t['display'];
break;
}
}
为了提高效率,我可以创建两个类似的阵列:
$travelID = array(
1 => array(
'link' => 'bus',
'display' => 'bus'
),
2 => array(
'link' => 'bike',
'display' => 'bicycle'
),
3 => array(
'link' => 'cart',
'display' => 'horse and cart'
)
);
$travelLink = array(
'bus' => array(
'id' => 1,
'display' => 'bus'
),
'bike' => array(
'id' => 2,
'display' => 'bicycle'
),
'cart' => array(
'id' => 3,
'display' => 'horse and cart'
)
);
然后执行以下操作:
echo $travelID[$id]['display'];
echo $travelLink[$link]['display'];
但是,有没有一种方法可以将所有数据保存在一起,同时仍然能够简单/快速地引用它?
$keys = array('id', 'link');
$multiple_key_array = new MultipleKeyArray($keys);
$data_1 = array('id' => 1, 'link' => 'bus', 'display' => 'bus');
$multiple_key_array->addData($data_1);
$data_2 = array('id' => 2, 'link' => 'bike', 'display' => 'bicycle');
$multiple_key_array->addData($data_2);
$data_3 = array('id' => 3, 'link' => 'cart', 'display' => 'horse and cart');
$multiple_key_array->addData($data_3);
var_dump($multiple_key_array->getData('id', 1));
class MultipleKeyArray{
private $data_array = array();
private $key_array = array();
private $map_array = array();
public function __construct($key_array){
$this->key_array = $key_array;
}
public function addData($data_array){
$index = count($this->data_array);
$this->data_array[] = $data_array;
foreach($this->key_array as $key){
if(array_key_exists($key, $data_array)){
$this->map_array[$key][$data_array[$key]] = $index;
}
}
}
public function getData($key, $value){
$index = $this->map_array[$key][$value];
return $this->data_array[$index];
}
}
没有办法,你可以只创建一个hepler,比如array_find_by(&$array);
,把所有必要的代码放在哪里,以免重复。
您可以创建"查找"哈希图,就像数据库中的索引一样,简单的示例:
<?php
$travel = getData();
$idx_id = createIndex($travel, 'id');
$idx_id[2]['foo'] = 'bar';
var_dump($travel);
function createIndex(&$arr, $elementName) {
$rv = array();
foreach( $arr as &$entry ) {
if ( isset($entry[$elementName]) ) {
$rv[ $entry[$elementName] ] = &$entry;
}
}
return $rv;
}
function getData() {
return array(
array(
'id' => 1,
'link' => 'bus',
'display' => 'bus'
),
array(
'id' => 2,
'link' => 'bike',
'display' => 'bicycle'
),
array(
'id' => 3,
'link' => 'cart',
'display' => 'horse and cart'
)
);
}
打印
array(3) {
[0]=>
&array(3) {
["id"]=>
int(1)
["link"]=>
string(3) "bus"
["display"]=>
string(3) "bus"
}
[1]=>
&array(4) {
["id"]=>
int(2)
["link"]=>
string(4) "bike"
["display"]=>
string(7) "bicycle"
["foo"]=>
string(3) "bar"
}
[2]=>
&array(3) {
["id"]=>
int(3)
["link"]=>
string(4) "cart"
["display"]=>
string(14) "horse and cart"
}
}
参见http://docs.php.net/references