У меня есть функция, которая генерирует выпадающий список на основе запроса или массива, который ему передан (он делает больше, но это несущественно для этого вопроса).В настоящее время у меня оба работают нормально, но в функции много избыточности, чтобы заставить работать и запросы, и массивы, и я хотел бы упростить ее.
Что мне интересно, если есть способ«преобразовать» или преобразовать результат запроса, который будет обрабатываться как ассоциативный массив вместо ресурса, без необходимости циклически перебирать результаты запроса.Кстати, в настоящее время мы находимся в MS SQL без планов перехода на другую СУБД.
РЕДАКТИРОВАТЬ: Вот мой код (немного изменен с производства, но вы получите суть).
function phpSelect($varName, &$queryName,$valueField, $displayField, $selectedValue, $returnFullSelect = true, $additionalAttributes = "", $distinctOnly = false){
/**
* Creates select dropdown from SQL results and selects given value
*/
$thisSelect = '';
$resultsArray = array();
//If they request a full tag, start it here//
if($returnFullSelect){
$thisSelect = "<select name=\"$varName\" id=\"$varName\" " .$additionalAttributes .'>
';
$thisSelect .= ' <option value=""> </option>
';// clean up - decide if we should put a blank option first or not
}
if(is_resource($queryName) ){ // use this for queries
if( mssql_num_rows($queryName) == 0) return '<!-- Query passed was empty -->';//If the query is empty, just return empty string
mssql_data_seek($queryName,0);
//new dBug($queryName);
$row_thisQuery = mssql_fetch_assoc($queryName);
$totalRows_thisQuery = mssql_num_rows($queryName);
do {
$tempAlreadyExists = array_search(trim(strtoupper($row_thisQuery[$valueField])),$resultsArray);
if(!$distinctOnly or !is_numeric($tempAlreadyExists) ){ // if Distinct is set to false or this value is not already in the array, add to the array, otherwise, skip it
$thisOption = '<option value="' .$row_thisQuery[$valueField] .'"';
if( is_string($selectedValue) ){ //perform case insensitive check
if( strtoupper( trim($row_thisQuery[$valueField]) ) == strtoupper( trim($selectedValue) ) ){
$thisOption .=" selected";
}
} else {
if($row_thisQuery[$valueField] == $selectedValue){
$thisOption .=" selected";
}
}
$thisOption .='>';
$thisOption .= $row_thisQuery[$displayField];
$thisOption .= '</option>
';
$thisSelect .= $thisOption;
array_push($resultsArray,trim( strtoupper($row_thisQuery[$valueField]) ) );
} //End checking for distinct values
} while ($row_thisQuery = mssql_fetch_assoc($queryName));
if($returnFullSelect){
$thisSelect .= '</select>
';
}
return $thisSelect;
} elseif( is_array($queryName) ){ // use this for arrays
foreach ($queryName as $i => $values) {
$thisOption = '<option value="' .$values[$valueField] .'"';
if($values[$valueField] == $selectedValue){
$thisOption .=" selected";
}
$thisOption .='>';
$thisOption .= $values[$displayField];
$thisOption .= '</option>
';
$thisSelect .= $thisOption;
}
//If they request a full tag, end it here//
if($returnFullSelect){
$thisSelect .= '</select>
';
}
return $thisSelect;
} else { // didn't pass a query or array, return failure
return false;
}
}