2015-04-21 57 views
0

今天我有一個很奇怪的問題。我有一個序列化數組,看起來像這樣:非串行陣列給出了最奇怪的結果

a:4:{i:0;s:7:"Perfect";i:1;s:10:"jawel hoor";i:2;s:14:"Ach jawohl joh";i:3;s:2:"Ja";} 

再經過我執行此代碼:

include '../../database/connect.php'; 
Class Calc { 
    function getPrice($id) { 
     $Db = new Db(); 
     $sth = $Db->dbh->prepare("SELECT * FROM orders WHERE id = :id"); 
     $sth->execute(array(':id'=>$id)); 


     $are_you_serial = $sth->fetchAll(); 
     foreach($are_you_serial as $row) { 
      $serialised = $row['reply_array']; 
      $product_id = $row['product_id']; 
      $user_id = $row['user_id']; 
     } 
     $array = unserialize($serialised); 
     foreach($array as $row) { 
      echo $row[1]; 
     } 

    } 
} 
$calc = new Calc(); 
$calc->getPrice(11); 

EACA出來。當我打電話0行PjAJ出來。 當我打電話第2行,這似乎是錯誤:

rwh 
Notice: Uninitialized string offset: 2 in index.php on line 29 

這是陣列的樣子,如果我只是print_r的在$數組:

Array 
(
    [0] => Perfect 
    [1] => jawel hoor 
    [2] => Ach jawohl joh 
    [3] => Ja 
) 

我也可以調用$數組[0 ],它會顯示正確的東西,但一旦我把它放在foreach中,它就不再起作用了。

+3

'foreach($ array as $ row){ echo $ row [1]; ($ array as $ row){ echo $ row; }' –

+3

你正在查詢什麼可能(可能)只有一行數據。你爲什麼使用fetchAll()和一個循環來記錄單個記錄?爲什麼不只是'$ row = $ sth-> fetch()'? –

+0

因爲我也需要user_id和product_id @MarcB //編輯:nvm我也很笨,謝謝你:P – user2879055

回答

1

你的第一個foreach不斷重新分配變量,所以$serialised(應該是$serialized BTW)將由你實際上調用unserialize的時間只有永遠保持最後行的值。我會添加我認爲你想要的東西,但現在,一些更詳細的信息,爲什麼你會得到「奇怪」或意外輸出:

有關如何閱讀PHP序列化格式的一些信息:

a:4:{i:0;s:7:"Perfect";i:1;s:10:"jawel hoor";... 
  • a:4:{:下面是一個數組,含有4鍵 - 值對
  • i:0;:一個整數,值0。因爲這是一個數組的一部分,所有奇數值是鍵,偶數值是值,所以數組的第一個索引是0
  • s:7:"Perfect";:一個字符串,7個字符長,字符串本身是「完美」 (沒有引號)

同樣適用於被序列化的對象:

O:8:"stdClass":2:{s:3:"bar";i:123;s:3:"foo";i:456;} 
  • o:8:"stdClass":2:{:一個對象,類名,其中爲8個字符長(stdClass),用2 properti設置ES
  • s:3:"bar";i:123;:屬性名稱是3個字元長串(「欄」),它的值是一個int()
  • s:3:"foo";i:456;:3個字元長屬性(「foo」 的)與價值
  • }:序列化對象的結束

認識到這一點,你應該能夠制定出你的數據的AF做什麼之三,你已經序列化的,即這樣的:

foreach ($array as $row) { 
    echo $row[1]; 
} 

僅僅是錯誤的形形色色的$row值將是一個字符串,得到一個字符串的偏移索引/是可能的(最好使用{}符號,如$row{1}),但它會返回字符,其偏移量爲n,其中n是括號內的數字/鍵。字符串與陣列一樣,爲零索引BTW,因此$string = 'foo'; echo $string{0};將回顯「f」echo $string{1};將回顯「o」

你想要什麼,然後就是寫:

foreach ($array as $row) { 
    echo $row; 
} 

或更短:

echo implode(PHP_EOL, $array);//PHP_EOL to add linebreaks between the strings 

就像我開頭所說的,你只有真正處理的最後系列化價值,是什麼你實際上想要的可能是更像這樣的東西:

$unserialized = []; 
foreach ($sth->fetchAll() as $row) { 
    //add unserialized values to an array 
    $unserialized[] = unserialize($row['reply_array']); 
} 
//$unserialized is now an array of arrays 
foreach ($unserialized as $rowNr => $array) { 
    echo 'Row #', $rowNr+1, ': ', PHP_EOL, 
     implode(PHP_EOL, $array); 
} 

這應該讓你開始d ...