0

我正在编写将索引数组更改为关联数组的代码。它适用于我检查过的所有州,加利福尼亚除外。对于 california,它暂时是一个关联数组,然后它突然变成一个索引数组,最后又变回一个关联数组。当我回显各个索引时,我得到了我希望在关联数组中使用的值,所以我不确定它为什么不粘住。任何人都可以帮忙吗?

$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 

看看它在哪里突然变成了一个索引数组?

4

1 回答 1

0

您的问题来自自然发生的行为array_merge()

将一个或多个数组的元素合并在一起,以便将一个数组的值附加到前一个数组的末尾。它返回结果数组。

如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个。但是,如果数组包含数字键,则后面的值不会覆盖原始值,而是会被追加。

带有数字键的输入数组中的值将使用从结果数组中的零开始的递增键重新编号。

PHP array_merge() 参考

您可以尝试将所有键声明为字符串。

编辑

奇怪的是,我的测试无法让它发挥作用。比这更奇怪的是,我发现了一种我从未考虑过的更简单的连接数组的方法。

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

当你print_r($gagenum)应该是两个数组与他们拥有的键相连。您可以保留它,也可以将结果用于 avar_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()将第二个参数优先于第一个,并且连接方法将第一个参数优先于第二个。array_merge()由于某种原因,即使显式声明,仍将类似数字的字符串视为 int。这是通过将行更改为:

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

var_dump($int1)在合并之前正确地将键显示为字符串,但仍以数字方式重新分配键。也许是错误?

哪个更快

进入性能测试!测试是在不改变原始数组的情况下完成的,使用 8 个具有以下格式的 for 循环进行了测试:

$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 秒。

所以连接方法绝对是更好的方法,尤其是如果你想保留数组键。array_merge()当您想要保留所有值,但想要将两个不同的数组重组为int一个顺序数组以用于可以使用良好for循环的脚本时使用。

于 2013-08-30T16:29:08.137 回答