2017-06-05 84 views
2

我有一個深層多維數組,我需要提取特定鍵的值。我發現array_walk_recursive功能將是我的最佳選擇。我只需要第一次出現。我如何獲得第一次出現array_walk_recursive在php

我的陣列看起來像這樣 - (除了要複雜得多)

Array (
    [vehicle info] => Array (
     [one] => Array (
      [submodel] => LX 
      [engine] => 2.3 
     ) 
     [two] => Array (
      [color] => blue 
      [year] => 2007 
      [wheels] => 4 
     ) 
     [three] => Array (
      [submodel] => LX 
      [make] => Ford 
      [model] => F-150 
      [offroad] => No 
     ) 
    ) 
) 

問題這裏,submodel是在一個和三個兩者。此外,數組並不一致,所以我必須使用array_walk_recursive來搜索匹配鍵,然後返回該鍵的值。

這裏是我當前的代碼 -

array_walk_recursive ($array, (function ($item, $key) { 
    $wanted = "submodel"; 
    if ($key === $wanted) { 
     echo ("$key is $item"); 
    } 
})); 

以上的回報submodel is LXsubmodel is LX

紅利問題!! 如何搜索多個鍵並返回每個鍵的第一個對應值?我正在考慮把所有想要的鍵放在一個數組中,然後做一個foreach循環,但不知道如何構造這個。我是新來的PHP。

+0

有趣的問題,雖然人們可能不知道該值表示返回的時候,因爲可能有多個具有相同索引的值? – Code4R7

+0

@ Code4R7,我看到它的方式是每個'vehicle_info'有多個相同的鍵,但它們有重複的值,所以只要返回一個值,無論哪一個具體保存都無關緊要。例如在[[one]'和'[three]'中存在'[submodel] => LX' – Hollings

+0

這個人確實說*'我是PHP的新手。'*,我想這也適用於數據庫。我的意思是,這通常是MySQL/MariaDB/PostgreSQL進入圖片的地步。 – Code4R7

回答

2

代碼:

$array=['vehicle info'=>[ 
     'one'=>['submodel'=>'LX','engine'=>2.3], 
     'two'=>['color'=>'blue','year'=>2007,'wheels'=>4], 
     'three'=>['submodel'=>'LX','make'=>'Ford','model'=>'F-150','offroad'=>'No'] 
    ] 
]; 

$find=['submodel','offroad']; 

array_walk_recursive($array,function($v,$k)use($find,&$result){ 
    if(in_array($k,$find) && !isset($result[$k])){ 
     $result[$k]="$k is $v"; 
    } 
}); 
var_export($result); 

輸出:

array (
    'submodel' => 'submodel is LX', 
    'offroad' => 'offroad is No', 
) 
2

我會先設置你想要的值爲null,然後只保存它們,如果還沒有找到,通過檢查is_null()。我還沒有測試此代碼,但它應該是這個樣子:

$submodel = null; 
array_walk_recursive ($array, (function ($item, $key) { 
    $wanted = "submodel"; 
    if ($key === $wanted && is_null($submodel)) { 
     echo ("$key is $item"); 
     $submodel = $item; 
    } 
})); 
2

array_walk_recursive()沒有允許返回匹配結果然而,在PHP 7,你可以使用匿名函數和變量的缺陷存儲匹配值。

$matching = null; 
$wanted = "submodel"; 

array_walk_recursive ($array, function ($item, $key) use ($wanted, $matching) { 
    if (($key === $wanted) && is_null($matching)) { 
     $matching = $item; 
    } 
}); 
2

至於有沒有辦法從array_walk_recursive()提前返回,我建議創建一個函數找到$wanted第一次出現:

$arr = [ 
    'vehicle info' => [ 
    'one' => ['submodel' => 'LX', 'engine' => '2.3'], 
    'two' => ['color' => 'blue', 'year' => '2007', 'wheels' => '4'], 
    'three' => ['submodel' => 'LX', 'make' => 'Ford', 'model' => 'F-150', 'offroad' => 'No'], 
    ], 
]; 

function find($needle, $haystack, $found = '') 
{ 
    foreach ($haystack as $key => $value) { 
     if ($found) { 
      break; 
     } 
     if ($key === $needle) { 
      $found = "{$needle} is {$value}"; 
      break; 
     } 
     if (is_array($value)) { 
      $found = find($needle, $value, $found); 
     } 
    } 
    return $found; 
} 

$wanted = 'submodel'; 
$result = find($wanted, $arr); 

var_dump($result); // string(14) "submodel is LX" 

直播demo


更新:搜索多個密鑰,您需要在循環中執行它:

$multiple_keys = array('submodel', 'year'); 

foreach ($multiple_keys as $wanted) { 
    var_dump(find($wanted, $arr)); 
} 

// Output: 
// string(14) "submodel is LX" 
// string(12) "year is 2007" 

直播demo

相關問題