簡體   English   中英

將值添加到PHP數組中的特定鍵位置

[英]Adding values to a specific key position in PHP array

我正在使用一個除其他參數外的名稱數組,並創建一個<select>組合框,其中包含以該數組中的內容命名的<option>元素。 還將名稱的索引value分配給<option>節點的value屬性。 因此,例如,如果數組的索引0包含“ foo”,則它將創建如下標記: <option value="0">foo</option> 作為參考,以下是該庫的代碼:

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

這是我稱之為的地方:

myDiv = document.getElementById('tmp_stationDiv');
var stationsList = new Array();
stationsList = JSON.parse(<?php getStationList($regions); ?>);
myDiv.innerHTML = generateSelect("1",stationsList,
                            "slt_idStations",message["txt_choose_station"][lang],
                            '','show','blockDiv');

這是函數getStationList()的代碼:

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

現在,這工作正常。 getStationList()的輸出例如是"[\\"LA GRANDE RIVIERE A\\"]" ,然后我使用JSON.parse()將其轉換為javascript數組。

不幸的是,與<option>節點關聯的value將為0、1、2,...,n,其中n是工作站的數量-1。我想將工作站的名稱與其工作站ID相關聯(從數據庫中恢復的value ),因此與<option>節點關聯的value將是那些ID。 為此,我想我需要在相應ID的索引處推送站點的名稱。 我嘗試通過對getStationList()進行以下修改來做到這一點:

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

不幸的是,這不起作用,因為getStationList()函數的輸出現在類似於: "{\\"6047\\":[\\"LA GRANDE RIVIERE A\\"]}" 那么,我該如何修改代碼以生成其子元素<option>節點的<select>節點,其子節點的<option>節點的value屬性設置為每個對應站名的ID?

為什么不這樣

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

您正在使用array_push,它不允許您為推送值指定鍵-您只會得到下一個更高的可用索引。 因此,請勿使用array _ *()函數,而應將鍵/值對直接填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM