PHP двумерный массив с пустыми элементами

С большой помощью другого пользователя я пришел к выводу, что получаю двумерный массив, который я хотел. Каждый идентификатор, который я получил ($ 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]; : "";