PHP Trouble переименовывает ключ массива - PullRequest
0 голосов
/ 22 апреля 2011

Я читаю сотни CSV для импорта в БД.

Некоторые имена столбцов содержат одинаковые данные, но имеют разные имена во всех файлах.

Например, в одном файле будет указано «Телефон», а в другом - «EveningPhone» ... оба содержат одни и те же данные, разные имена.

Я пытаюсь переименовать все в EveningPhone, потому что я сделал большую часть кода, когда понял, что в разных файлах были разные имена заголовков. Слишком ленив, чтобы заменить все, я думаю ..

Я создаю ассоциативный массив, чтобы сопоставить данные и затем передать их в БД.

Проблема в том, что я не могу получить ключи для переименования в одном соглашении. Вот функция, где это происходит:

public function readCSV($file) {
    /**
     * @todo: LOAD THE FILE INTO A MULTIDIMENSIONAL ASSOCIATIVE ARRAY TO DETERMINE THE FILEDS
     */

    // Read the first line to get the headers
    $headers = fgetcsv($file);


    if (!array_key_exists('EveningPhone', $headers)) {
        if (array_key_exists('Phone', $headers)) {
            $headers['EveningPhone'] = $headers['Phone'];
            unset($headers['Phone']);
        } else {
            die("other");
        }
    }

    format::neat_r($headers);   // basically print_r but adds a new line to read it easier...
    die();

Массив возвращается до и после как это:

LeadID

AddDate Фамилия Имя Адрес город государственный Почтовый Индекс LeadLocator Телефон Эл. адрес секс Комментарии

В конце концов, я все еще получаю не определенные ошибки EveningPhone из файла, который использует телефон в качестве номера телефона ..

У кого-нибудь есть идеи?

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

Вам нужно использовать

 if (!in_array('EveningPhone', $headers)) {

потому что массив $headers - это обычный индексированный список после того, как вы только что прочитали его через fgetcsv. Поэтому array_key_exists не будет работать. Позже вы можете использовать его как dict, но на данный момент это еще не ключ массива.

Для замены записи используйте:

 $headers[array_search("EveningPhone", $headers)] = "Phone";
0 голосов
/ 22 апреля 2011

fgetcsv не возвращает ассоциативный массив.Он вернет массив с данными в качестве значений, поэтому вы должны использовать in_array или array_search (когда вам нужен ключ).Код, который читает фактические данные, вероятно, использует array_combine для построения ассоциативного массива с использованием заголовка.

public function readCSV($file) {
    /**
     * @todo: LOAD THE FILE INTO A MULTIDIMENSIONAL ASSOCIATIVE ARRAY TO DETERMINE THE FILEDS
     */

    // Read the first line to get the headers
    $headers = fgetcsv($file);


    if (!in_array('EveningPhone', $headers)) {
        if ($phoneKey = array_search('Phone', $headers)) {
            $headers[$phoneKey] = 'EveningPhone';
        } else {
            die("other");
        }
    }

    format::neat_r($headers);   // basically print_r but adds a new line to read it easier...
    die();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...