2012-03-28 16 views
0

相當簡單;我只是好奇,如果有更好的方式來實現這一點。多維數組到鍵/值字典;從功能返回,沒有控制結構

鑑於陣列如下:
preg_match_all()PREG_SET_ORDER結果)

$matches = array(2) { 
    [0]=> 
    array(5) { 
    [0]=> 
    string(8) "key=foo;" 
    ["key"]=> 
    string(3) "key" 
    [1]=> 
    string(3) "key" 
    ["value"]=> 
    string(3) "foo" 
    [2]=> 
    string(3) "foo" 
    } 
    [1]=> 
    array(5) { 
    [0]=> 
    string(12) "pattern=bar;" 
    ["key"]=> 
    string(7) "pattern" 
    [1]=> 
    string(7) "pattern" 
    ["value"]=> 
    string(3) "bar" 
    [2]=> 
    string(3) "bar" 
    } 
} 

我想提取到一個數組,執行以下操作:

array(2) { 
    ["key"]=> 
    string(3) "foo" 
    ["pattern"]=> 
    string(3) "bar" 
} 

基本上爲每個生成一個關聯數組$array[$i]['key'] => $array[$i]['value'] 0。
如果這聽起來有點混亂,對不起,這是後期

無論如何,這是微不足道的;然而,我試圖完成這個使用PHP核心array_*函數,即返回結果數組(對不起array_walk)。

foreach或其他循環控制結構。

現在,我已經得到了下來,這樣的:

\array_combine(\array_map(function($match) { 
     return (string) $match['key']; 
    }, $matches), \array_map(function($match) { 
     return (string) $match['value']; 
    }, $matches)) 

其中一期工程,但它不完全簡潔;我不喜歡它不得不array_map兩次 - 一次爲鍵,一次爲值。

有沒有更多的優雅的解決方案,從一個格式良好的多維數組中提取嵌套值到一維的鍵/值對字典?

+1

'$ A = []; array_walk($ m){$ a [$ m ['key']] = $ m ['value'];},$ matches);' – kirilloid 2012-03-28 06:44:20

+0

@kirilloid如此接近;我忘了提及'array_walk'因爲它返回'bool'而不是結果數組而退出。這個調用被作爲一個參數傳遞給另一個函數,並且結果數組應該被傳入。謝謝! – Dan 2012-03-28 06:47:43

+0

您可以將此調用包裝到另一個函數中。而且,我擔心,有這麼有限的功能*允許*,沒有更短的解決方案。 – kirilloid 2012-03-28 06:49:12

回答

2

隨着PHP V5.3 +:

因爲:

5.3.0更改初始允許混合,先前整數。

http://php.net/manual/en/function.array-reduce.php

$matches = array(
    array(
       'key=foo;', 
    'key' => 'key', 
       'key', 
    'value' => 'foo', 
       'foo', 
), 
    array(
       'pattern=bar;', 
    'key' => 'pattern', 
       'pattern', 
    'value' => 'bar', 
       'bar', 
), 
); 

$a = array_reduce($matches, function ($b, $v) { 
    return $b + array($v['key'] => $v['value']); 
}, array()); 

print_r($a); 

/* 
Array 
(
    [key] => foo 
    [pattern] => bar 
) 
*/ 
+0

謝謝@Yoshi - 簡單而優雅;發現 :) – Dan 2012-03-28 15:21:09