2010-01-12 127 views
0

我的PHP數組是這樣的:怪異PHP數組

Array ( 
[0] => dummy 
[1] => stdClass Object ( 
    [aid] => 1 
    [atitle] => Ameya R. Kadam) 
[2] => stdClass Object ( 
    [aid] => 2 
    [atitle] => Amritpal Singh) 
[3] => stdClass Object ( 
    [aid] => 3 
    [atitle] => Anwar Syed) 
[4] => stdClass Object ( 
    [aid] => 4 
    [atitle] => Aratrika) 
)) 

現在我想呼應裏面[atitle]的數值。 是特定的,我想將內存中的值破壞到另一個變量中。 我怎麼能讓它發生?

回答

1
foreach($array as $item){ 
    if(is_object($item) && isset($item->atitle)){ 
     echo $item->atitle; 
    } 
} 

讓他們到一個數組你只需要做:

$resultArray = array(); 
foreach($array as $item){ 
    if(is_object($item) && isset($item->atitle)){ 
      $resultArray[] = $item->atitle; 
    } 
} 

然後resultArray是所有atitles

然後你就可以輸出如你想的數組

$output = implode(', ', $resultArray); 
+0

你可以跳過'is_object'檢查,只是測試是否設置了'$ item-> atitle'。 – 2010-01-12 21:09:18

+0

這樣做。我現在如何內爆它? – amit 2010-01-12 21:15:35

+0

發佈更新爲您提供了一個atitles數組 – Simon 2010-01-12 21:49:33

0

你在那裏有一個對象。

您可以通過

$array[1]->atitle; 
+0

OP想要的值不在索引0 – 2010-01-12 20:53:35

4

訪問[atitle]隨着PHP 5.3:

$result = array_map(function($element) { return $element->atitle; }, $array); 

,如果你沒有5.3,你必須使匿名函數經常之一,提供的名稱作爲字符串。


在上面,我錯過了對空元素的一部分,使用這種方法,這可能使用array_filter解決:

$array = array_filter($array, function($element) { return is_object($element); }); 
$result = array_map(function($element) { return $element->atitle; }, $array); 

如果你是瘋了,你可以在一行寫這...

+0

並非所有元素都具有如示例中所示的標題。這會出錯。 – 2010-01-12 21:04:35

+1

是的,我錯過了原始帖子中沒有正確格式化的內容。我猜想,在Simon的回答中,foreach()循環在這種情況下更好。但讓我們在這裏保留答案,因爲array_map可以非常強大。但是我也會將array_filter添加到這個例子來顯示這些函數的功能。 – johannes 2010-01-12 22:03:48

3

你的數組聲明有點像這樣:
(嗯,你可能真的是從數據庫或類似的東西獲取數據 - 但這應該沒問題,在這裏測試)

$arr = array(
    'dummy', 
    (object)array('aid' => 1, 'atitle' => 'Ameya R. Kadam'), 
    (object)array('aid' => 2, 'atitle' => 'Amritpal Singh'), 
    (object)array('aid' => 3, 'atitle' => 'Anwar Syed'), 
    (object)array('aid' => 4, 'atitle' => 'Aratrika'), 
); 


這意味着你可以提取所有的標題爲數組,循環您的初始陣列(不包括第一元件,以及使用每個對象的atitle屬性)

$titles = array(); 
$num = count($arr); 
for ($i=1 ; $i<$num ; $i++) { 
    $titles[] = $arr[$i]->atitle; 
} 
var_dump($titles); 


這將讓你像這樣的數組:

array 
    0 => string 'Ameya R. Kadam' (length=14) 
    1 => string 'Amritpal Singh' (length=14) 
    2 => string 'Anwar Syed' (length=10) 
    3 => string 'Aratrika' (length=8) 


,現在就可以implode這一切爲一個字符串:

echo implode(', ', $titles); 

,你會得到:

Ameya R. Kadam, Amritpal Singh, Anwar Syed, Aratrika 
+0

這將至少在「虛擬」元素上發出通知,不是嗎? – Simon 2010-01-12 21:04:15

+0

請注意,這裏假定只有沒有標題的數組索引是第一個。 – 2010-01-12 21:05:39

+0

@Simon:我不這麼認爲(而且我也沒有注意到那個代碼);; @cballou:確實;另一種解決方案是在循環中測試當前行的數據是否是一個對象,並且它具有初始索引 – 2010-01-12 21:20:09

0

如果你想在輸出前檢查標題的存在,你可以使用:

// generates the title string from all found titles 
$str = ''; 
foreach ($array AS $k => $v) { 
    if (isset($v->title)) { 
     $str .= $v->title; 
    } 
} 
echo $str; 

如果你想在一個數組中的這些只是一個快速切換存儲方法:

// generates the title string from all found titles 
$arr = array(); 
foreach ($array AS $k => $v) { 
    if (isset($v->title)) { 
     $arr[] = $v->title; 
    } 
} 
echo implode(', ', $arr); 

stdClass要求使用指針符號->用於參考而陣列需要你通過索引來引用它們,即[4]。您可以參考這些像:

$array[0] 
$array[1]->aid 
$array[1]->atitle 
$array[2]->aid 
$array[2]->atitle 
// etc, etc. 
0
$yourArray = array(); //array from above 
$atitleArray = array(); 

foreach($yourArray as $obj){ 
if(is_object($obj)){ 
    $atitleArray[] = $obj->aTitle; 
    } 
} 

看到,因爲你的數組的每個元素怎麼還不是一個對象,你需要檢查這一點。