Получение «неопределенного индекса» для массива, созданного с помощью str_getcsv ();но var_dump () показывает, что ключ существует - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть массив, созданный с помощью str_getcsv():

$array = array_map('str_getcsv', file($file['tmp_name']));
array_walk($array, function(&$a) use ($array) {
    $a = array_combine($array[0], $a);
});
array_shift($array);

Возвращенный $array выводит это из var_dump($array).

array(18) {
  ["fund"]=>
  string(6) "Fund 1"
  ["name"]=>
  string(13) "Property Name"
  ["investment"]=>
  string(13) "Investment Name"
  ["region"]=>
  string(6) "London"
  ["sector"]=>
  string(6) "Office"
  ["status"]=>
  string(8) "Published"
  ["description"]=>
  string(0) ""
  ["acquisition_date"]=>
  string(0) ""
  ["size"]=>
  string(0) ""
  ["address_line_1"]=>
  string(0) ""
  ["address_line_2"]=>
  string(0) ""
  ["city"]=>
  string(6) "London"
  ["county"]=>
  string(0) ""
  ["postcode"]=>
  string(0) ""
  ["longitude"]=>
  string(0) ""
  ["latitude"]=>
  string(0) ""
  ["featured"]=>
  string(0) ""
  ["external_link"]=>
  string(0) ""
}

Когда я пытаюсь получить доступ $array['fund'];, я получаю Notice: Undefined index: fund.Сначала я подумал, что fund имеет скрытый символ в имени ключа из заголовков CSV, потому что $array['name'] работает, но я проверил, и единственными скрытыми символами являются CR LF.

Я видел похожие проблемы в StackOverflow для многомерных массивов, но не для одномерных.

Любая помощь будет принята с благодарностью.Я даже пытался привести к типу StdClass и $array->fund и получить аналогичную ошибку о несуществующем свойстве.

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

1 Ответ

0 голосов
/ 19 февраля 2019

tldr;

Вы пытаетесь получить доступ к $array['fund'], когда вы должны получить доступ к $array[0]['fund'].Вы рассматриваете это как одномерный массив, но это многомерный массив (измерение 1, индексированное; измерение 2, ассоциативное).


Объяснение:

Вы являетесьне показывает конкретный код, к которому вы пытаетесь получить доступ к $array['fund'], ни свой конкретный ввод, но проблема, как представляется, заключается в том, что вы неправильно понимаете структуру результирующего массива для кода, который вы используете для анализа вашего CSV.

array_map() + array_walk() + array_combine() + array_shift() кажется немного запутанным способом получить то, что вы хотите, и результаты показывают.Это яркий пример того, как «умный» код становится продуктивным.Конструкцию массива с двумя строками сложнее проанализировать, чем некоторые альтернативы.

Я собираюсь предположить этот ввод, поскольку вы не предоставляете никакого ввода, и чтение внешнего файла выходит за рамки этой проблемы (ина самом деле это не проблема):

// input

$lines = <<<EOF
fund,name,investment,region,sector,status,description,acquisition_date,size,address_line_1,address_line_2,city,county,postcode,longitude,latitude,featured,external_link
"Fund 1","Property Name","Investment Name","London","Office","Published","","","","","","London","","","","","",""
EOF;

Это соответствует массиву, который вы показываете в своем вопросе.

Давайте попробуем разобрать код в дальнейшем:

$array = array_map('str_getcsv', explode(PHP_EOL, $lines));

Это оставляет вас с массивом из двух элементов.В индексе 0 у вас есть заголовки, а в индексе 1 у вас есть значения.

array_walk($array, function(&$a) use ($array) {
    $a = array_combine($array[0], $a);
});

Здесь вы проходите каждый из этих двух массивов и array_combine() каждый с массивом с индексом 0. Вы хотитесоздать массивы, где ключами являются значения из массива, которые содержат заголовки ($array[0]).

Примечание. Это должно сделать очевидным, что $array в индексированном массиве, так как вы ужепытаясь получить доступ к элементу в позиции 0.

Очевидно, что в итоге вы получите дополнительный массив (массив заголовков в сочетании с массивом заголовков), но об этом вы узнаете позже.

array_shift($array);

Здесь вы избавляетесь от массива заголовков (с такими значениями, как $element['fund'] = 'fund').Вы удаляете первый элемент вашего массива из двух элементов.Опять же, эта операция ** имеет смысл, только если $array является индексированным массивом для начала.

На данный момент у вас есть массив из одного элемента, и этот элемент является массивом с 18 значениями ключей =>.

Если в этот момент вы попытаетесь получить доступ к $array['fund'], он, естественно, потерпит неудачу.Поскольку $array является индексированным массивом , а не ассоциативным массивом .

Вам необходимо получить доступ к элементам этого индексированного массива, а затем попытаться получить доступfund.

Например: $array[$i]['fund'];

Вы можете видеть, как это работает здесь .

...