2014-03-19 93 views
0

使用PHP水平的動態數量,我想編寫完成的任務是通過這個僞代碼所示的函數:PHP函數,可以從一個數組的鍵返回值深

function return_value($input_string='array:subArray:arrayKey') 
{ 
    $segments = explode(':',$input_string); 
    $array_depth = count(segments) - 1; 

    //Now the bit I'm not sure about 
    //I need to dynamically generate X number of square brackets to get the value 
    //So that I'm left with the below: 

    return $array[$subArray][$arrayKey]; 
} 

是上述可能?我真的很感激一些關於如何實現它的指針。

+0

這聽起來像是一個[XY問題](HTTP://meta.stackexchange .COM /問題/ 66377 /什麼,是最XY-問題)。爲什麼不能使用'serialize'或'json_encode'? – h2ooooooo

+0

我正在嘗試構建一個全局可用的靜態配置類,我可以通過使用類似於'config :: get('db:server')的語法檢索值' – Marc

回答

2

您可以使用一個遞歸函數(或者因爲它的尾遞歸的迭代當量):

function return_value($array, $input_string) { 
    $segments = explode(':',$input_string); 

    // Can we go next step? 
    if (!array_key_exists($segments[0], $array)) { 
     return false; // cannot exist 
    } 

    // Yes, do so. 
    $nextlevel = $array[$segments[0]]; 
    if (!is_array($nextlevel)) { 
     if (1 == count($segments)) { 
      // Found! 
      return $nextlevel; 
     } 
     // We can return $nextlevel, which is an array. Or an error. 
     return false; 
    } 
    array_shift($segments); 
    $nextsegments = implode(':', $segments); 

    // We can also use tail recursion here, enclosing the whole kit and kaboodle 
    // into a loop until $segments is empty. 
    return return_value($nextlevel, $nextsegments); 
} 

傳遞一個對象

比方說,我們希望這是一個API,僅通過一個字符串(請記住,HTTP在這方面有一些方法限制,並且您可能需要POST字符串而不是GET)。

的字符串將需要包含數組數據「鑰匙」的位置。這是最好的,如果我們先發送鍵,然後數組:

function decodeJSONblob($input) { 
    // Step 1: extract the key address. We do this is a dirty way, 
    // exploiting the fact that a serialized array starts with 
    // a:<NUMBEROFITEMS>:{ and there will be no "{" in the key address. 
    $n = strpos($input, ':{'); 
    $items = explode(':', substr($input, 0, $n)); 
    // The last two items of $items will be "a" and "NUMBEROFITEMS" 
    $ni = array_pop($items); 
    if ("a" != ($a = array_pop($items))) { 
     die("Something strange at offset $n, expecting 'a', found {$a}"); 
    } 
    $array = unserialize("a:{$ni}:".substr($input, $n+1)); 

    while (!empty($items)) { 
     $key = array_shift($items); 
     if (!array_key_exists($key, $array)) { 
      // there is not this item in the array. 
     } 
     if (!is_array($array[$key])) { 
      // Error. 
     } 
     $array = $array[$key]; 
    } 
    return $array; 
} 

$arr = array(
    0 => array(
     'hello' => array( 
      'joe','jack', 
      array('jill') 
     ))); 

print decodeJSONblob("0:hello:1:" . serialize($arr)); 
print decodeJSONblob("0:hello:2:0" . serialize($arr)); 

回報

jack 
jill 

同時要求0:hello:2:會讓你的數組{ 0: 'jill' }

+0

這很好,謝謝你的幫助。 – Marc

+0

這需要我傳入一個數組和一個字符串,但我希望只能傳入一個字符串。例如'return_value('array:subArray:arrayKey')'。有沒有辦法調整你的功能來適應這個? – Marc

+0

你需要這個數組是全局的。函數如何訪問數組呢?或者你可以發送數組和按某種方式編碼的密鑰序列(例如序列化)。 – LSerni

0

您可以使用recursionarray_key_exists走到所述密鑰的級別。

function get_array_element($key, $array) 
{ 
    if(stripos(($key,':') !== FALSE) { 
    $currentKey = substr($key,0,stripos($key,':')); 
    $remainingKeys = substr($key,stripos($key,':')+1); 
    if(array_key_exists($currentKey,$array)) { 
     return ($remainingKeys,$array[$currentKey]); 
    } 
    else { 
     // handle error 
     return null; 
    } 
    } 
    elseif(array_key_exists($key,$array)) { 
    return $array[$key]; 
    } 
    else { 
    //handle error 
    return null; 
    } 
} 
0

使用諸如使用循環以下或引用數組鍵

<?php 

function lookup($array,$lookup){ 
     if(!is_array($lookup)){ 
       $lookup=explode(":",$lookup); 
     } 
     $key = array_shift($lookup); 
     if(!isset($array[$key])){ 
       //throw exception if key is not found so false values can also be looked up 
       throw new Exception("Key does not exist"); 
     }else{ 
       $val = $array[$key]; 
       if(count($lookup)){ 
         return lookup($val,$lookup); 
       } 
       return $val; 
     } 
} 

$config = array(
     'db'=>array(
       'host'=>'localhost', 
       'user'=>'user', 
       'pass'=>'pass' 
     ), 
     'data'=>array(
       'test1'=>'test1', 
       'test2'=>array(
         'nested'=>'foo' 
       ) 
     ) 

); 


echo "Host: ".lookup($config,'db:host')."\n"; 
echo "User: ".lookup($config,'db:user')."\n"; 
echo "More levels: ".lookup($config,'data:test2:nested')."\n"; 

輸出一個遞歸函數:

Host: localhost 
User: user 
More levels: foo