2016-04-02 2 views
1

içine değeri dize, benim dize şöyle olabilir:dönüştürme tuşu/Örnek olarak ilişkilendirilebilir dizinin

first_name:Tom last_name:Jones email:[email protected] 

benim dizi aşağıdaki gibi görünecektir isteyeyim:

Array (
    ['first_name'] => 'Tom', 
    ['last_name'] => 'Jones', 
    ['email'] => '[email protected]' 
) 

Bu daha sonra olacak veritabanını sütun ve değer temelinde aramak için kullanılır. Bu yüzden önce arama için anahtarı (örneğin, first_name) ve değeri (Tom gibi) almam gerekecek. Bu işleri

((?:[a-z][a-z0-9_]*)) 

:

aşağıdaki regex var. :'dan önce ve :'dan sonra tüm dizeleri bulur, ancak bunu, ihtiyacım olan bir biçim dizisine koymak için nasıl ayrıştırılacağını anlayamıyorum.

cevap

-1

Sadece bir boşlukta dize içindizesini ve sonra da her iki noktadaki array_map() numaralı değerleri kullanabilirsiniz. bu sadece yerine anahtarlar ve değerler almak için array_column() kullandıktan sonra:

$result = array_column(array_map(function($v){ 
    return explode(":", $v); 
}, explode(" ", $str)), 1, 0); 

başlangıç ​​ve kullanımı örneğin yakalama gruplarını adında olarak Ayrıca regex ile bunu yapabilir

preg_match_all("/(?P<keys>\w+):(?P<values>[\[email protected]]+)/", $str, $m); 
$result = array_combine($m["keys"], $m["values"]); 
+0

Mükemmel! Seni cevap olarak işaretliyorum. Patlatmayı unuttum(). –

+0

@ScottPlunkett Rica ederim. Ayrıca bir regex ile nasıl yapabileceğinize dair bir çözüm ekledim. – Rizier123

1

Yukarıdaki yöntem işe yarar, ancak bence bunu okumak çok zor. Üç ekstra işlev çağrısı yapmanıza gerek kalmadan aşağıdaki yöntemi kullanarak bunu daha kolay ve verimli bir şekilde yapabilirsiniz.

$user_info = 'first_name:Tom last_name:Jones email:[email protected]'; 

$user = array(); 
foreach (explode(' ', $user_info) as $property) { 
    $part = explode(':', $property); 
    $user[$part[0]] = $part[1]; 
}