Javascript 向PHP数组中的特定键位置添加值

Javascript 向PHP数组中的特定键位置添加值,javascript,php,arrays,string,web,Javascript,Php,Arrays,String,Web,我正在使用一个库,其中包括一个名称数组,并创建一个组合框,其中包含以该数组中的内容命名的元素。它还为节点的值属性指定获取名称的索引的值。因此,例如,如果数组的索引0包含“foo”,那么它将创建如下标记:foo。以下是该库的代码供参考: function generateSelect(objDimensionAssoc, obj, select_name, label_name, function_name, state, DivAlignement) { //Valid object b

我正在使用一个库,其中包括一个名称数组,并创建一个组合框,其中包含以该数组中的内容命名的
元素。它还为
节点的
属性指定获取名称的索引的值。因此,例如,如果数组的索引0包含“foo”,那么它将创建如下标记:
foo
。以下是该库的代码供参考:

function generateSelect(objDimensionAssoc, obj, select_name, label_name, function_name, state, DivAlignement)
{
    //Valid object before
    sChaine = "";
    if(  (obj != null) && (obj != undefined) && (obj != "") && (parseInt(countObject(obj)) > 0) ){
        if( state == 'show' ){

            sChaine +="<label for='"+select_name+"' ><span>"+label_name+"</span></label>\n";
            sChaine +="<div class='"+DivAlignement+"'>\n";
            if(function_name != "")
                sChaine +="<select name='"+select_name+"' id='"+select_name+"' onchange='"+function_name+"' >\n";
            else
                sChaine +="<select name='"+select_name+"' id='"+select_name+"'>\n";

            //lang = variable reconnu dans tout les pages

            for (var x=0; x < obj.length; x++){
                //One or two domentionnal array
                if(obj[x] != null){
                    if(objDimensionAssoc == "1"){
                        if(chaineUrl){
                            sChaine += compare_and_create( x, obj[x], chaineUrl[select_name], select_name);
                        } else {
                            sChaine += compare_and_create( x, obj[x], "", select_name);
                        }
                    } else { 
                        if(chaineUrl){  
                            sChaine += compare_and_create( x, obj[x][lang], chaineUrl[select_name], select_name);
                        } else {
                            sChaine += compare_and_create( x, obj[x][lang], "", select_name);
                        }
                    }
                }
            }

            sChaine +="</select>\n";
            sChaine +="</div>\n";

        }
        return(sChaine);
    } else {
        //empty array
        if( state == 'show' ){
            sChaine +="<label for='"+select_name+"' ><span>"+label_name+"</span></label>\n";
            sChaine +="<div class='"+DivAlignement+"'>\n";
            sChaine +="<select name='"+select_name+"' id='"+select_name+"' disabled='true' >\n";
            sChaine +="<option value='0'>&nbsp;</option>\n";
            sChaine +="</select>\n";
            sChaine +="</div>\n";
        }
        return(sChaine);
    }
}

function compare_and_create( key, innerText, string_compare,select_name)
{
    if(key == string_compare){
        return ("<option value='"+key+"' selected='selected'>"+innerText+"</option>\n");
    } else {
        return ("<option value='"+key+"'>"+innerText+"</option>\n");
    }
}
现在这个工作非常好。例如,
getStationList()
的输出是
“[\”LA GRANDE RIVIERE A\“]”
,然后我使用
JSON.parse()
将其转换为javascript数组

不幸的是,与
节点关联的
值将是0、1、2、…、n,其中n是站数-1。我想将站点的名称与其站点ID(我从数据库中恢复)相关联,因此与
节点关联的
值将是这些ID。要做到这一点,我想我需要在相应ID的索引处推送站点的名称。我已经尝试过这样做,并对
getStationList()
进行了以下修改:

不幸的是,这不起作用,因为
getStationList()
函数的输出现在是这样的:
“{\“6047\”:[\“LA GRANDE RIVIERE A\”]}”
。那么,我必须如何修改我的代码才能生成我的
节点及其子节点
节点,这些节点的
属性设置为每个相应站点名称的ID?

为什么不这样做

$arr = array()
while ($row = $stmt->fetch()) {
     $arr[$row['stationID']] = $row['stationName'];
}

您使用的是array_push,它不允许您为被推送的值指定一个键——您只需要获得下一个更高的可用索引。因此,不要使用数组函数,直接填充您的键/值对。

不要调用
json\u encode()
调用
json\u encode
@Barmar的结果。如果我不这样做,我会得到以下错误:
SyntaxError:json.parse:unexpected character
,它位于以下行:
stationsList=json.parse({“6047”:“LA GRANDE Rivier A”})
。在调用
json\u encode()的结果上不调用
json\u encode()
1秒会使函数的输出
getStationList()`
{“6047”:“LA GRANDE Rivier A”
而不是
“{6047\”:[\“LA GRANDE Rivier A\”]}
啊,这是因为您调用的是
json.json()
在Javascript中不必要。插入
getStationList()
的结果会自动解析它,然后再次解析。去掉这些额外的编码和解析。我刚刚尝试了这个解决方案,它输出了相同的
“{\'6047\:[\'LA GRANDE RIVIERE A\']”
就像我最初做的那样。当我调试代码时,问题似乎出在
for(var x=0;x
中,它不用于创建
节点(我的组合框是空的)。如果你的键不连续,你不能使用for循环。你需要
for(var I in arr)
loopIt现在在我修改(var x=0;xfor(var x在obj中)时起作用
,不幸的是,现在我在我所有的
组合框中都有额外的
节点,这些节点包含函数名,如
属性,以及
标记之间的函数实现。有没有办法摆脱它们?这似乎是因为for去获取我的值在
\u proto\u
以及数组的“常规”索引中(在调试时发现)。如果有帮助,显示此行为的组合框的类型为[object array],而正常的组合框(我尝试解决方案的station组合框)的类型为调试器中的[object object object]。jquery
$。each()
也许更好,它知道跳过“内部”的东西。
function getStationList($regions)
{
    $slt_nomStations = (isset($_GET["slt_nomStations"]) ? $_GET["slt_nomStations"] : 0);;
    $db = ConnectionFactory::getFactory()->getConnection();
    $stmt = $db->prepare("SELECT DISTINCT S.station_id, S.name, SA.sub_area_name FROM dev.Station AS S INNER JOIN dbo.SubArea AS SA ON S.sub_area_id = SA.sub_area_id INNER JOIN data.MonthlyNormalData as MND ON MND.station_id = S.station_id WHERE sub_area_name = '$regions[$slt_nomStations]' AND value IS NOT NULL ORDER BY S.name ASC");
    $stmt->execute();

    $stations = array();
    $lastStationName = "";
    while ($row = $stmt->fetch())
    {
        if ($lastStationName != $row['name'])
        {
            array_push($stations, $row['name']);
            $lastStationName = $row['name'];
        }
    }

    $newJSArray = json_encode($stations);
    echo json_encode($newJSArray);
}
function getStationList($regions)
{
    $slt_nomStations = (isset($_GET["slt_nomStations"]) ? $_GET["slt_nomStations"] : 0);;
    $db = ConnectionFactory::getFactory()->getConnection();
    $stmt = $db->prepare("SELECT DISTINCT S.station_id, S.name, SA.sub_area_name FROM dev.Station AS S INNER JOIN dbo.SubArea AS SA ON S.sub_area_id = SA.sub_area_id INNER JOIN data.MonthlyNormalData as MND ON MND.station_id = S.station_id WHERE sub_area_name = '$regions[$slt_nomStations]' AND value IS NOT NULL ORDER BY S.name ASC");
    $stmt->execute();

    $IDs = array();
    $names = array();
    $stations = array();
    $lastStationName = "";
    while ($row = $stmt->fetch())
    {
        if ($lastStationName != $row['name'])
        {
            array_push($names, $row['name']);
            array_push($IDs, $row['station_id']);

            $lastStationName = $row['name'];
        }
    }

    $stations = array_fill_keys($IDs, $names);

    $newJSArray = json_encode($stations);
    echo json_encode($newJSArray);
}
$arr = array()
while ($row = $stmt->fetch()) {
     $arr[$row['stationID']] = $row['stationName'];
}