2013-08-30 34 views
0

我正在寫這個代碼,將索引數組更改爲關聯數組。它適用於我檢查過的所有州,除了加利福尼亞州。對於加利福尼亞州來說,它的聯合陣列有一段時間,然後它變成了一個無處不在的索引數組,然後返回到結尾的聯合數組。當我回應單個索引時,我得到了我期望在關聯數組中使用的值,所以我不確定它爲什麼不會保持不變。誰能幫忙?爲什麼我的關聯數組變成一箇中間索引的數組?然後變回聯想的?

$ids_file = file_get_contents("http://waterdata.usgs.gov/ca/nwis/current?index_pmcode_STATION_NM=1&index_pmcode_DATETIME=2&index_pmcode_72019=72&index_pmcode_00065=261&index_pmcode_00060=191&group_key=NONE&format=sitefile_output&sitefile_output_format=rdb&column_name=agency_cd&column_name=site_no&column_name=station_nm&column_name=dec_lat_va&column_name=dec_long_va&column_name=coord_acy_cd&column_name=dec_coord_datum_cd&column_name=alt_va&column_name=alt_acy_va&column_name=alt_datum_cd&sort_key_2=site_no&html_table_group_key=NONE&rdb_compression=file&list_of_search_criteria=realtime_parameter_selection"); 
$gages = explode("\t",$ids_file); 

//this provides the randomized list of gages to pick from 

for($i=19;$i<count($gages);$i=$i+9){ 
    $gagenew = array($gages[$i]=>$gages[$i+1]); 
    $gagenum = array_merge($gagenum,$gagenew); 
} 

這是我所得到的,當我回聲$gagenum

[09526200] => YPSILANTI CANAL NEAR WINTERHAVEN, CA 
[09527590] => COACHELLA CANAL ABV ALL-AMERICAN CANAL DIV 
[09527594] => COACHELLA CANAL NEAR NILAND, CA 
[09527597] => COACHELLA CANAL NEAR DESERT BEACH, CA 
[09527700] => ALL-AMERICAN CANAL BELOW DROP 2 RESERVOIR OUTLET 
[09530000] => RESERVATION MAIN DRAIN NO. 4 NEAR YUMA, AZ 
[09530500] => DRAIN 8-B NEAR WINTERHAVEN, CA 
[0] => BOREHOLE SPG CHANNEL NR TECOPA HOT SPGS, CA 
[1] => AMARGOSA RV AT TECOPA, CA 
[2] => AMARGOSA RV ABV CHINA RANCH WASH NR TECOPA, CA 
[3] => WILLOW CK AT CHINA RANCH, CA 
[4] => SALT C NR MECCA 
[5] => ALAMO R NR NILAND CA 
[6] => NEW R AT INTERNATIONAL BOUNDARY AT CALEXICO CA 
[7] => NEW R NR WESTMORLAND CA 
[8] => SNOW C NR WHITE WATER CA 
[9] => FALLS C NR WHITE WATER CA 
[10] => WHITEWATER R A WINDY POINT MAIN CHANNEL CA 
[11] => WHITEWATER R A WINDY POINT OVERFLOW CHANNEL CA 

看到被它改變到索引數組突然冒出一個小樣本?

+1

其中'$ number'是從哪裏來的?它有什麼價值? – cmorrissey

+0

'$ gagenum'應該是什麼? – Davit

+0

@ChristopherMorrissey oops ...這是一個錯誤...讓我編輯 – user2434247

回答

0

你的問題來自於天然存在於array_merge()行爲:

用於合併一個或多個陣列的元件一起,使得一個值被附加到以前的一個的端部。它返回結果數組。

如果輸入數組具有相同的字符串鍵,則該鍵的後面的值將覆蓋前一個鍵。但是,如果數組包含數字鍵,則後面的值不會覆蓋原始值,但會被追加。

使用數字鍵輸入數組中的值將使用從結果數組中的零開始的遞增鍵重新編號。

PHP array_merge() Reference

你可以嘗試宣告所有的按鍵爲字符串。

編輯

奇怪的是,我的測試無法得到它的行爲。甚至比這更奇怪,我發現了一種更簡單的連接數組的方法,這是我從未考慮過的。

//Replace array_merge() with this 
$gagenum += $gagenew; 

當你print_r($gagenum)它應該是兩個陣列加入了與他們的鑰匙。你可以將它留在那裏,或者使用var_dump($gagenum)的結果並對其進行調試。

實驗

進一步array_merge()和串聯方法$array1 + $array2之間的差異測試應該幫助提供更好的理解的差異。

<?php 
$int1 = array(2 => 'george', 3 => 'sam', 4 => 'bob'); 
$int2 = array(0 => 'sue', 1 => 'debbie', 2 => 'sally'); 
$str1 = array('one' => 'ken', 'two' => 'tom', 'three' => 'phil'); 
$str2 = array('three' => 'jenny', 'four' => 'alice', 'five' => 'jan'); 

$mergeii = array_merge($int1, $int2); 
$mergeis = array_merge($int1, $str1); 
$mergesi = array_merge($str1, $int1); 
$mergess = array_merge($str1, $str2); 
$concatii = $int1 + $int2; 
$concatis = $int1 + $str1; 
$concatsi = $str1 + $int1; 
$concatss = $str1 + $str2; 

// Merge Int/Int - Numeric Keys Reassigned Starting From [0], with $int1 first. No Overwrites. 
echo "Merge Int/Int:\r\n"; print_r($mergeii); 

// Merge Int/Str - Numeric Keys Reassigned Starting From [0], $int1 first. No Overwrites. 
echo "\r\nMerge Int/Str:\r\n"; print_r($mergeis); 

// Merge Str/Int - Numeric Keys Reassigned Again, $str1 first. No Overwrites. 
echo "\r\nMerge Str/Int:\r\n"; print_r($mergesi); 

// Merge Str/Str - No Numeric Keys. Value of Key 'Three' overwritten with $str2 value. Bye bye, 'phil'. 
echo "\r\nMerge Str/Str:\r\n"; print_r($mergess); 

// Concatenate Int/Int - Numeric Keys Preserved. Value of Key (int)2 from $int1 Preserved, 'sally' lost. 
echo "\r\nConcatenate Int/Int:\r\n"; print_r($concatii); 

// Concatenate Int/Str - Expected results, All Key/Value Pairs Preserved 
echo "\r\nConcatenate Int/Str:\r\n"; print_r($concatis); 

// Concatenate Str/Int - Expected results, All Key/value Pairs Preserved 
echo "\r\nConcatenate Str/Int:\r\n"; print_r($concatsi); 

// Concatenate Str/Str - Expected results, Value of Key (str)'three' from $int1 Preserved, 'jenny' lost. 
echo "\r\nConcatenate Str/Str:\r\n"; print_r($concatss); 
?> 

所以array_merge()優先在所述第一,第二個參數,和所述級聯方法優先第一過第二個。由於某些原因,即使明確聲明,仍然將類數字字符串視爲int。這是通過改變線路:

$int1 = array((string)'2' => 'george', (string)'3' => 'sam', (string)'4' => 'bob'); 

var_dump($int1)正確顯示合併前的鍵爲字符串,但仍然重新分配鍵數字。也許錯誤?

哪一個是更快

上至性能測試!測試不改變原始數組中進行,採用8測試與此格式的循環:

$start1 = microtime(true); 
for($x = 0; $x < 100000; ++$x) 
{ 
    $merged = array_merge($int1, $int2); 
} 
$end1 = microtime(true); 
  • 陣列合併功能平均時間是隨時隨地0.15之間 - 0.19秒,以$ INT1/$ INT2通常是最低-0.01,其中$ str1/$ str2通常是+0.02秒。 $ str1/$ int1和$ int1/$ str1之間的中間平均觸發0.16-0.17。

  • 連接方法平均時間在0.05-0.07之間。再次,$ int1/$ int2領先-0.01秒。通常情況下,$ str1/$ str2的時間也延長了0.02秒。

所以連接方法絕對是一種更好的方法,特別是如果你想保留數組鍵。如果要保留所有值,但想要將兩個不同的int陣列重組爲一個順序陣列,則可以使用array_merge(),以便使用良好的for循環的腳本。

+0

是的,我認爲這可能是一個問題。我嘗試使用'strval'將數字更改爲字符串,但也許我沒有這樣做......我會再試一次。 – user2434247

+0

完全分隔,在array_merge php手冊註釋中找到+ =方法。 – Jason

+0

很奇怪!我簡直不敢相信那麼簡單!在這裏我正在分析這些陣列的每一個方面。謝謝! – user2434247