2012-01-05 42 views
2

想象一下,我有一組數據。在它的每個產品含「身份證」,「鏈接」和「顯示」另一個數組:我應該如何構建一個數組以幫助引用數據?

$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),以顯示「顯示」我需要做的是相同的:

​​

更有效率,我可以創建兩個相似矩陣:

$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']; 

但有保持所有數據在一起,同時仍然能夠簡單/快速引用它的一種方式?

+0

爲什麼會這樣壞?這正是我在多數情況下使用多維數組的原因 – OptimusCrime 2012-01-05 12:16:32

+0

@OptimusCrime哪個選項?兩個單獨的數組選項看起來像數據重複,我假設通過一個數組選項循環會很費時 – 2012-01-05 12:49:16

+0

第一個。除非你有一個真正的大陣,否則這根本不是問題。無論如何,只需要一小段時間就完成。 – OptimusCrime 2012-01-05 12:52:49

回答

2
$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]; 

    } 

} 
0

有沒有辦法,你可以創建一個hepler,如array_find_by(&$array);在哪裏把所有必要的代碼,以便不重複它。

0

您可以創建 「查找」 包含HashMap,幾乎就像在一個數據庫中的索引,簡單的例子:

<?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

相關問題