Создайте ассоциативный массив в php с динамическим ключом и значением

Я хочу создать ассоциативный массив в php с динамическим ключом, а также динамическое значение из конкретной таблицы mysql.

Имя таблицы monthly_salary с двумя столбцами с именами month и salary соответственно.

Я получаю данные внутри него:

$sql = mysql_query('SELECT * FROM monthly_salary');
$sql2 = mysql_query('SELECT * FROM monthly_salary');

Затем назначил и объединил собранные данные с $mon и $sal:

$mon = "";
$sal = "";
while($row = mysql_fetch_array($sql)){
    $mon .= $row['month'].", ";
}
while($row = mysql_fetch_array($sql2)){
    $sal .= $row['salary'].", ";
}

После этого я преобразовал его в массив и объединил, пока он не стал ассоциативным массивом:

$monArray = array(substr(trim($mon), 0, -1));
$salArray = array(substr(trim($sal), 0, -1));
$key = "";
$keyWithVal = "";
foreach($monArray  as $k){
    $key .= $k." => ";
}
foreach($salArray  as $k){
    $keyWithVal .= $key.$k.",";
}

$associativeArray = array(substr(trim($keyWithVal), 0, -1));

Моя проблема в том, что когда я повторяю это, результат всегда такой: 3500=>Jan=>3500:

foreach($associativeArray  as $k => $id){
    echo $k."=>".$id;
}

Итак, как я могу это исправить и с правильным выводом Jan=>3500?


person scireon    schedule 04.02.2013    source источник
comment
Почему вы запускаете один и тот же SQL-запрос дважды?   -  person Rocket Hazmat    schedule 04.02.2013
comment
Что вы ожидаете от array(substr(trim($mon), 0, -1))? Все, что он делает, это преобразует строку в массив, который дает вам массив с одним элементом. array('1, 2, 3') не создает массив из 3 элементов, он создает массив из одного элемента, строки '1, 2, 3'. Чтобы превратить строку в массив, используйте explode. $array = explode(', ', '1, 2, 3);.   -  person Rocket Hazmat    schedule 04.02.2013


Ответы (3)


Вы слишком усложняете эту проблему. Это можно сделать просто, с меньшим количеством петель.

Во-первых, вам нужно запустить SQL только один раз. Во-вторых, постройте массив в 1-м цикле.

$sql = mysql_query('SELECT * FROM monthly_salary');

$associativeArray = array();
while($row = mysql_fetch_array($sql)){
   // Put the values into the array, no other variables needed
   $associativeArray[$row['month']] = $row['salary'];
}

foreach($associativeArray as $k => $id){
    echo $k."=>".$id;
}
person Rocket Hazmat    schedule 04.02.2013
comment
Чтобы показать связь, вместо использования цикла вы можете выполнить команду echo ‹pre›; print_r ($ associativeArray); - person Strixy; 04.02.2013
comment
@Strixy: Правда, я просто копировал код из вопроса. - person Rocket Hazmat; 04.02.2013

Почему бы вам просто не сделать:

$associativeArray = array();
while($row = mysql_fetch_array($sql)){
    $associativeArray[$row['month']] = $row['salary'];
}
person DiscoInfiltrator    schedule 04.02.2013
comment
В чем разница между этим ответом и ответом, предоставленным Rocket Hazmat? - person nickb; 04.02.2013
comment
Нет, мы просто написали одновременно. Он/она опередил меня. - person DiscoInfiltrator; 04.02.2013
comment
@DiscoInfiltrator: Это потому что я ниндзя ^^ - person Rocket Hazmat; 04.02.2013

Следующее работало для меня для создания ассоциативного массива. array_push не работает с ассоциативным массивом, но использование унарного оператора работает:

$associativeArray += [$key => $value];
person srigu    schedule 14.08.2020