2014-01-07 47 views
0

我試圖做一個函數,它將根據對象的不同參數製作一個簡單的鍵 - >值列表。只要每個對象都是平坦的,我就可以正常工作,但是現在我處於一種情況,我需要列表的值基於一個數組屬性。我可以強迫它假設這隻有一個深度,但我如何解釋可變數組深度?陣列深度未知時動態檢索值

我已經改變了它,以便value參數可以傳遞一個假設形式爲$ object-> array [0] [array [1]]的數組;

希望你可以從代碼告訴我想要做的事:

function make_list($data, $value = 'name', $key = 'id'){ 
    $new_arr = array(); 
    if (is_array($data)) 
    { 
     if (isset($data[0]->weight)){ 
     usort($data, function($a, $b){ 
      return $a->weight == $b->weight ? 0 : ($a->weight > $b->weight) ? 1 : -1; 
     }); 
     } elseif (isset($data[0]->value)){ 
     usort($data, function($a, $b){ 
      return $a->value == $b->value ? 0 : ($a->value > $b->value) ? 1 : -1; 
     }); 
     } 
     foreach ($data as $key => $item) 
     { 
     if (!is_object($item)) 
     { 
      $item = (object)$item; 
     } 
     if(isset($item->{$key})) 
     { 
      if (is_array($value)){ 
      //account for nested value requests, assuming object properties that are arrays (seems to be what most of the database calls return) ['property', 'value'] 
      foreach ($value as $key => $val) { 
       if($key == 0){ 

       } else { 
         //don't know what to do here! 
       } 
      } 
        //THIS WOULD GENERALLY WORK IF ARRAY LENGTH IS 2 -- BUT SYNTAX IS FUBARED 
      $new_arr[$item->{$key}] = $item->{$value[0]}[{$value[1]}]; 
      } else { 
        //THIS IS THE OLD BEHAVIOUR THAT WAS WORKING WHEN PASSING A STRING 
       $new_arr[$item->{$key}] = $item->{$value}; 
      } 
     } 
     } 
    } 
    return $new_arr; 
    } 

一旦我明白這一點我會做它,因此$鍵也可以是一個數組。

$data = new Customer(); 
$data->name = 'John Smith'; 
$data->age = 21; 
$data->contact = array('street'=>'Main St', 'number'=>56, 'city_id'=>1, 'city'=>array('name'=>'Dorset')); 

//Want these behaviours to work: 
make_list($data, array('contact', 'city', 'name'); 
make_list($data, array('contact', 'street'); 

make_list($ data,'age');

+3

您是否考慮過遞歸? –

+0

是啊sorta ..(我標記了)我們不是最好的朋友,雖然..我真的不知道如何在這裏應用它(或大多數地方tbh) – Damon

+0

你可以發佈一個你期望的初始例子和修改數組/對象/任何看起來像? – Dave

回答

2

你可能會看遞歸。我不打算在這裏輸入完整的解決方案,因爲我不完全清楚你的意圖。但是,我會給你一個典型遞歸函數的基本結構,讓你瞭解它如何被使用。

function make_list_recursive($data, $input_key, $input_value) { 
    $return_list = array(); 
    if(is_object($data)) { 
     // iterate publicly accessible properties of object  
     foreach($data as $key => $value) { 
      if (is_array($value)) { 
       // iterate over array and recurse each item 
       foreach($value as $array_val) { 
        $array_val_list = make_list_recursive($array_val, $input_key, $input_value); 
        $return_list = array_merge($return_list, $array_val_list); 
       } 
      } else { 
       // here is where you perform your key/value matching logic 
       // if the property matched your key/value criteria, then add it to $return_list 
       $return_list[{some key}] = {some value}; 
      } 
     } 
    } else (is_array($data)) { 
     // iterate through array and recurse each item 
     foreach($data as $array_val) { 
      $array_val_list = make_list_recursive($array_val, $input_key, $input_value); 
      $return_list = array_merge($return_list, $array_val_list); 
     } 
    } else { 
     throw new Exception('You must pass object or array to this function'); 
    } 
    return $return_list; 
} 
+0

感謝,給出了一個很好的概述。出於某種原因,這是一種令人驚訝的奇怪的方式來思考事情! – Damon