У меня есть файл CSV, чтобы сделать некоторые переменные MySQL удобными для чтения, где первый элемент в строке - это имя поля MySQL, а второй - удобное для пользователя имя, которое нужно заполнить в поле, например:

Hymn1,First Hymn,
Hymn2,Second Hymn,
date,Date,
C2W,Call To Worship,

Затем я создам отдельные списки, чтобы люди в церкви могли вводить релевантные для них данные - музыкальный директор будет вводить имена, авторов и тексты гимна, предложений и т.п. Я заполню этот список именами переменных MySQL и сгенерирую из них страницу.

Я хочу преобразовать этот CSV в массив, чтобы я мог сгенерировать страницу, которая будет отображать имена полей удобочитаемыми способами для меток полей.

Я думаю, что отчасти моя проблема в том, что у меня есть CSV-файл сбоку. В большинстве ответов предполагается, что первая строка - это имя поля, а остальные - это содержимое, но здесь это не так.

Если бы это был Python, я бы просто заархивировал их в словарь, но в PHP, очевидно, вы используете ассоциативные массивы.


Я открыл CSV и поместил результаты в строку с именем $keys и повторил строку, чтобы убедиться, что она отображается, как указано выше, что так и есть.

Затем я объявил массив, избавился от новой строки и заменил его второй запятой, а затем заменил вторую запятую на вертикальную черту:

$assoc = array();
$keys = str_replace("\r", ",", $keys);
$keys = str_replace(",,", "|", $keys);

После этого я превратил строку $ keys в новую переменную с вертикальной чертой в качестве разделителя. Все идет нормально.

$newvar = explode("|", $keys);

Наконец, я взорвал каждый из разделенных запятыми элементов в каждом ключе массива и связал их друг с другом в цикле foreach.

foreach($newvar as $iterator) {
    $mini = explode(",", $iterator);
    $mini[0] = ltrim($mini[0], "\n");
    $assoc[$mini[0]] = $mini[1]; }

Когда я выполнил print_r в своем массиве $assoc, он дал мне все, на что я надеялся. Из исходного кода:

Array
(
   [Hymn1] => First Hymn
   [Hymn2] => Second Hymn
   [date] => Date
   [C2W] => Call to Worship
)

Но - и это проблема - когда я пытался получить доступ к отдельным элементам в массиве с помощью echo $assoc['Hymn1']; или echo $assoc->Hymn1;, я ничего не получил. Я мог повторить "Hello World", и он бы появился, но ничего из этого.

Я также пробовал str_getcsv, но он создает только массив каждого элемента, разделенного запятыми, или массив, аналогичный этому, который в конечном итоге ничего не печатает, когда я пытаюсь повторить каждый элемент.

Я погуглил, я прочитал десятки ответов на StackOverflow, включая вопросы, предложенные на странице. Я занимаюсь этим несколько часов и готов выдернуть волосы. Я прочитал учебные пособия, я попытался создать простой ассоциативный массив и повторить его, чтобы убедиться, что я делаю это правильно (я прав), и все это приводит к одному ответу: ЭТО ДОЛЖНО РАБОТАТЬ, но это не так. Есть идеи?

1
Python Pastor 24 Июн 2020 в 20:23

2 ответа

Лучший ответ

Есть два способа получить доступ к данным: с помощью имени поля или удобной для пользователя версии.

Этот код читает файл и создает два массива при чтении файла. $variables использует значения Hymn1 в качестве ключей, $names использует значения First Hymn в качестве ключей.

$variables = [];
$names= [];
$fh = fopen($fileName, "r");
while ( $row = fgetcsv($fh))    {
    $variables [$row[0]] = $row[1];
    $names [$row[1]] = $row[0];
}
fclose($fh);

print_r($variables);
print_r($names);
1
Nigel Ren 24 Июн 2020 в 17:34

Обычно люди плохо справляются с учебниками, имеющими множество разнообразных примеров . Вам просто нужно предоставить и ключ и значение:

foreach ($newvar as $key1 => $value1)
{
 echo '<p>'.$key1.' = '.$value1.'</p>';
}
0
John 24 Июн 2020 в 17:26