С большой помощью другого пользователя я пришел к выводу, что получаю двумерный массив, который я хотел. Каждый идентификатор, который я получил ($ talente), сохраняет строку из CSV. Работает как очарование массива. Но результат меня смущает.
Это CSV, который я использую:
Schild,1,Licht,1w10,- Schutz,1,Licht,1w10,- Licht,4,Licht,1w10,- Genesung,1,Licht,-,- Aufopfern,1,Licht,-,-
Сценарий:
<?php $talente = $_GET['talente']; $myFile = fopen("talente.csv", "r"); $csv = []; while ($data = fgetcsv($myFile, 1000, ",")) { $csv[] = $data; } fclose($myFile); $talentline = array_filter($csv, function($i) use ($talente) { return in_array($i, $talente); }, ARRAY_FILTER_USE_KEY); print_r(array_values($talentline)); echo $talentline[1][0]; echo $talentline[2][0]; //line 21. echo $talentline[3][0]; ?>
print_r (array_values ($ talentline)); дает мне следующий результат для id 1 и 3.
[0] => Array ( [0] => Schutz [1] => 1 [2] => Licht [3] => 1w10 [4] => - ) [1] => Array ( [0] => Genesung [1] => 1 [2] => Licht [3] => - [4] => - )
Три эха в конце дают мне следующее:
Schutz Примечание: Неопределенное смещение: 2 в C: \ xampp \ htdocs \ DvC Generator \ php \ test.php в строке 21 Genesung
Есть две проблемы, которые я не могу решить. Первый заключается в том, что печатные строки являются одной строкой после той, которую я ожидал бы. Поэтому вместо «Шутца» я ожидал бы «Шильд».
Большая проблема, которую я имею, заключается в том, что скрипт сохраняет строку в позиции массива, равной ID. Это не то, что мне нужно, потому что оно также сохраняет пустые элементы массива. Моим желаемым результатом было бы Schild в массиве [0] и Licht в массиве [1], когда были отправлены идентификаторы 1 и 3.
Надеюсь, я смогу объяснить это достаточно хорошо.
0
Итак, нуль – первый, а второй – второй .
Ваша проблема «неопределенного смещения» вызвана тем, что вы только «сохраняете» значения массива, которые находятся в массиве ввода $_GET['talente']
. Если вы измените это значение на 2
вы получите неопределенные уведомления о сдвиге для 1 и 3 и т. Д.
Ваша первая проблема заключается в том, что массивы начинаются с [0]
поэтому, если у вас есть два значения в новом массиве talentline
тогда первый ключ [0]
а второе значение – [1]
. и т.п.
Вторая проблема связана с тем, что, сравнивая значения ключа в анонимной функции, вы ищете первое значение (массив [0]
), запрашивая значение номер 1
заданное массивом $_GET
. Вот почему он дает вам ожидаемые (но правильные) результаты.
Для второй проблемы (которая является ошибкой кодирования):
Вам нужно отрегулировать значение ключа, либо увеличив значения клавиш на +1, либо уменьшив значения опорных значений на -1, чтобы выровнять входные данные с заданными значениями CSV:
return in_array($i, $talente--); //reduces the input comparison value by 1, //so that the first value ("1") is treated as key "0".
Во-вторых, Чтобы исправить уведомление, которое вы получили, ссылаясь на ссылку на отмену массива позже в скрипте:
print isset($talentline[2][0]) ? $talentline[2][0]; : ""; // shorthand PHP stating that if value is set then print it, // else don't print anything.
Код, который я использовал для получения ответа (PHP 5.6.2). Очевидно, скорректировано, поскольку у меня нет файла CSV для импорта и т. Д.
<?php $talente = array(0=>1,1=>3); $csv[] = array(0=>"Schild", 1=>1, 2=>"Licht", 3=>"1w10", 4=>"-"); $csv[] = array(0=>"Schutz", 1=>1, 2=>"Licht", 3=>"1w10", 4=>"-"); $csv[] = array(0=>"Licht", 1=>4, 2=>"Licht", 3=>"1w10", 4=>"-"); $csv[] = array(0=>"Genesung",1=>1,2=>"Licht",3=>"-",4=>"-"); $csv[] = array(0=>"Aufopfern",1=>1,2=>"Licht",3=>"-",4=>"-"); $talentline = array_filter($csv, function($i) use ($talente) { return in_array($i, $talente--); }, ARRAY_FILTER_USE_KEY); $talentline = array_filter($talentline); print_r(array_values($talentline)); print isset($talentline[1][0]) ? $talentline[1][0]; : ""; print isset($talentline[2][0]) ? $talentline[2][0]; : ""; print isset($talentline[3][0]) ? $talentline[3][0]; : "";