2010-07-01 58 views
3

在我的數據庫中,一些字段設置被序列化並存儲。當我這樣做:PHP的問題 - 如何創建一個字符串的數組?

print_r(unserialized($r['settings'])); 

我會得到這樣的:

Array ( 
[prefix] => 
[suffix] => 
[min] => 
[max] => 
[allowed_values] => 1|Common 2|Rare 3|Almost Extinct 
) 

我試圖創建一個基於值allowed_values一個這樣的數組:

Array (
[1] => Common 
[2] => Rare 
[3] => Almost Extinct 
) 

的問題是,當我使用爆炸(「|」,$ r ['allowed_values'])時,我得到:

Array(
[0] => 1 
[1] => Common 2 
[2] => Rare 3 
[3] => Almost Extinct 
) 

這是有道理的,但顯然不是我所希望的......所以,我只是想知道是否有一個簡單的方法來做我在這裏嘗試的東西?我想過多次使用爆炸,一次用於空間,一次用於管道,但是由於「幾乎滅絕」的空間,這將不起作用...

+0

你需要發佈更多的代碼,你最初創建的字符串是誰? – 2010-07-01 15:30:51

+0

你想讓數組看起來像什麼? – Joseph 2010-07-01 15:47:54

+0

您必須更改數據庫的設置,以將這些設置存儲在不同的字段中 – 2010-07-01 16:02:06

回答

3

試試這個:

$tab=array(); 
preg_match_all("/\s*(\d+)\|([^\d]+)/",$r['allowed_values'],$tab); 
print_r(array_combine($tab[1],$tab[2])); 

這應該使的伎倆:)

+2

除((w +))不匹配'幾乎滅絕'外。用'([^ \ d] +)替代'假設「值」永遠不會有數字。使用固定的正則表達式,這個答案是我認爲的最好的解決方案,因爲它不會假設數字將從最低到最高排序,並且將每個值盲目推送到數組的末尾 – MooGoo 2010-07-01 15:56:41

+0

編輯了回覆,以便對帳戶進行評論 – dweeves 2010-07-01 16:33:15

+0

我喜歡這種方法。 – Mike 2010-07-01 17:16:27

0

我認爲這應該起作用。 這會拆分第一個數字和「|」炭

<?php 
$string = "1|Faruk 2|Test"; 
$array = preg_split('/\d/', $string, -1, PREG_SPLIT_NO_EMPTY); 
$content = explode("|", implode($array)); 

var_dump($content); 
?> 

這裏是結果

array(3) { 
    [0]=> 
    string(0) "" 
    [1]=> 
    string(6) "Faruk " 
    [2]=> 
    string(4) "Test" 
} 
2

如果原來的指標不是從1順序,你需要保持它們原樣,看到d​​weeves的答案,因爲這樣可以將索引和值綁定在一起ectly。

$string = unserialized($r['settings']['allowed_values']); 
//$string = '1|Common 2|Rare 3|Almost Extinct'; 

print_r (preg_split("/\d+\|/", $string, -1, PREG_SPLIT_NO_EMPTY)); 

輸出:

Array 
(
    [0] => Common 
    [1] => Rare 
    [2] => Almost Extinct 
) 
+0

它看起來不同於問題的數組(不同的鍵)。 – 2010-07-01 16:02:26

+0

我剛剛使用'unserialized($ r ['settings'] ['allowed_values'])'作爲'$ string'的內容。我已經澄清了這一點。 – Mike 2010-07-01 16:06:48

0

我會使用一個正則表達式匹配的每個條目的格局,但僅捕獲感興趣的文本。使用preg_match_all(...)$match對象填充了捕獲組的子陣列。

$input = '1|Common 2|Rare 3|Almost Extinct'; 
preg_match_all('/\d+\|([^\d]+)/',$input, $match); 
print_r($match[1]); 

產地:

需要注意的是,如果你是標籤將使用數字,你需要調整的正則表達式。

如果存儲在表格中的值可能無序,此方法還允許您捕獲數字並創建自己的有序數組。

相關問題