Php 为什么我的关联数组中途变成了索引数组?然后变回关联的?

Php 为什么我的关联数组中途变成了索引数组?然后变回关联的?,php,arrays,associative-array,Php,Arrays,Associative Array,我正在编写这段代码,将索引数组更改为关联数组。它适用于我检查过的所有州,除了加利福尼亚州。对于加利福尼亚州来说,它是一个关联数组一段时间,然后突然变为索引数组,最后变回关联数组。当我回显单个索引时,我会得到我希望在关联数组中使用的值,所以我不确定为什么它不会保持不变。有人能帮忙吗 $ids_file = file_get_contents("http://waterdata.usgs.gov/ca/nwis/current?index_pmcode_STATION_NM=1&index_

我正在编写这段代码,将索引数组更改为关联数组。它适用于我检查过的所有州,除了加利福尼亚州。对于加利福尼亚州来说,它是一个关联数组一段时间,然后突然变为索引数组,最后变回关联数组。当我回显单个索引时,我会得到我希望在关联数组中使用的值,所以我不确定为什么它不会保持不变。有人能帮忙吗

$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);
}

查看它从何处变为索引数组?

您的问题来自于
array\u merge()
中自然发生的行为:

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

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

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

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

编辑

奇怪的是,我的测试不能让它正常工作。更奇怪的是,我发现了一种更简单的连接数组的方法,这是我从未考虑过的

//Replace array_merge() with this
$gagenum += $gagenew;
当您打印($gagenum)时,应该是两个数组与它们拥有的键连接在一起。您可以将其保留在该位置,或者将结果用于
var\u转储($gagenum)
并对其进行调试

实验

进一步测试
array\u 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);
?>
var\u dump($int1)
在合并前正确地将键显示为字符串,但仍然以数字方式重新分配键。也许是虫子

哪一个更快

继续进行性能测试!测试是在不改变原始阵列的情况下进行的,使用8个for循环进行测试,使用以下格式:

$start1 = microtime(true);
for( $x = 0; $x < 100000; ++$x)
{
    $merged = array_merge($int1, $int2);
}
$end1 = microtime(true);
$start1=微时间(真);
对于($x=0;$x<100000;++$x)
{
$merged=array\u merge($int1,$int2);
}
$end1=微时间(真);
  • 数组合并函数平均时间在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\u merge()?它的值是多少?
$gagenum
应该是什么?@christophermorissey oops…那是个错误…让我来编辑that@Dachi$gagenum应该是量规编号和量规标题的关联数组。示例的前7个输出是正确的。请使用var_dump而不是print_r来更好地理解这一点。数字和字符串是混合键。是的,我想这可能是个问题。我尝试使用
strval
将数字更改为字符串,但可能我做得不对…我会再试一次。完全间隔,在数组上找到+=方法。\u merge php manual comments。奇怪!真不敢相信事情竟那么简单!在这里,我正在分析这些阵列的各个方面!谢谢不确定它的优化方面,但我自己将来可能会使用它,如果它能使我的代码更干净,我可能会回到旧项目:DNow我确定优化方面:)
$int1 = array( (string)'2' => 'george', (string)'3' => 'sam', (string)'4' => 'bob' );
$start1 = microtime(true);
for( $x = 0; $x < 100000; ++$x)
{
    $merged = array_merge($int1, $int2);
}
$end1 = microtime(true);