我試圖做一個函數,它將根據對象的不同參數製作一個簡單的鍵 - >值列表。只要每個對象都是平坦的,我就可以正常工作,但是現在我處於一種情況,我需要列表的值基於一個數組屬性。我可以強迫它假設這隻有一個深度,但我如何解釋可變數組深度?陣列深度未知時動態檢索值
我已經改變了它,以便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');
您是否考慮過遞歸? –
是啊sorta ..(我標記了)我們不是最好的朋友,雖然..我真的不知道如何在這裏應用它(或大多數地方tbh) – Damon
你可以發佈一個你期望的初始例子和修改數組/對象/任何看起來像? – Dave