0

Существует массив вот такого типа:

 0 => string '"Datasheets","Image","Digi-Key Part Number","Manufacturer Part Number","Manufacturer","Description","Quantity Available","Factory Stock","Unit Price (USD)","@ qty","Minimum Quantity","Series","Accessory Type","Material","Color","For Use With/Related Products"' (length=262)
 1 => string '"http://www.knowles.com/eng/content/download/3165/37817/version/2/file/bf-1861-000.pdf","http://media.digikey.com/Photos/Knowles%20Acoustics%20Photos/BF-1861-000.jpg","423-1158-ND","BF-1861-000","Knowles","ACOUSTIC DAMPER 1500 OHMS",1067,0,"1.67000",0,1,"BF","Damper","Metal Ferrule Housing","Green","Hearing Aids"' (length=314)

Требуется разбить строки на массивы с запятой в качестве разделителя.
Пробовал разбивать с помощью explode, но ничего не вышло.
Строка индексом [0] разбивается правильно, а вторая с индексом [1] разбивается некорректно, т.к. в строке в ненужных местах встречается разделитель.
Скажите, как игнорировать лишние разделители, чтобы при разбивке массива результат был такой:

array (size=16)
  0 => string '"Datasheets"' (length=15)
  1 => string '"Image"' (length=7)
  2 => string '"Digi-Key Part Number"' (length=22)
  3 => string '"Manufacturer Part Number"' (length=26)
  4 => string '"Manufacturer"' (length=14)
  5 => string '"Description"' (length=13)
  6 => string '"Quantity Available"' (length=20)
  7 => string '"Factory Stock"' (length=15)
  8 => string '"Unit Price (USD)"' (length=18)
  9 => string '"@ qty"' (length=7)
  10 => string '"Minimum Quantity"' (length=18)
  11 => string '"Series"' (length=8)
  12 => string '"Accessory Type"' (length=16)
  13 => string '"Material"' (length=10)
  14 => string '"Color"' (length=7)
  15 => string '"For Use With/Related Products"' (length=31)
6
  • Это забавно, даже здесь этот невидимый символ есть, и сохранился после всех фильтров хэшкода. Посмотрите, что между одинарной и двойной кавычкой перед "Datasheets" в оригинале вопроса ; )
    – Sergiks
    3 окт 2014 в 8:15
  • $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, "digikey.com/product-search/…); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $out = curl_exec($curl); $item_dan = explode("\n", $out); $string[] = array($item_dan); var_dump($string[0]); $aKeys = json_decode('[' .$string[0]. ']'); $aVals = json_decode( '[' . $string[1] . ']'); var_dump($aKeys); @sergiks Вот исходный согласно вашему примеру!
    – ggLike
    3 окт 2014 в 11:09
  • Оставьте уже json_decode() в стороне и посмотрите внимательно мой ответ ниже фразы "Upd. III"
    – Sergiks
    3 окт 2014 в 11:11
  • @sergiks, спасибо, что помогли разобрать пример! Все получилось, все работает. Функция реализована! Вторую неделю топтался на одном месте, не ожидал, что кто-то поможет, спасибо!
    – ggLike
    3 окт 2014 в 13:41
  • @ggLike, Если вам дан исчерпывающий ответ, отметьте его как верный (нажмите на галку рядом с выбранным ответом).
    – Sergiks
    3 окт 2014 в 13:49

2 ответа 2

1

Формат строк близок к JSON, я бы попробовал так (работает):

$aKeys = json_decode( '[' . $strings[0] . ']');
$aVals = json_decode( '[' . $strings[1] . ']');

if( is_null( $aKeys)  ||  is_null( $aVals)  ||  ( count( $aKeys) != count( $aVals))) { // что могло пойти не так?!
    return;
}

return array_combine( $aKeys, $aVals);

Второй вариантstr_getcsv() – разобрать строку, предположив её валидный CSV формат. Работает с вашим примером данных.

Upd. III Действительно, раз вам отдают CSV, лучше пользоваться ф-ей str_getcsv(). Вот рабочий код. Фильтрация понадобилась, чтобы очистить от непечатных символов в начале.

function filt( $s) {
    return filter_var(
        $s,
        FILTER_SANITIZE_STRING,
        FILTER_FLAG_STRIP_LOW  |  FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_NO_ENCODE_QUOTES
    );
}

$url = "http://www.digikey.com/product-search/download.csv?FV=fff4000b%2Cfff80054&mnonly=0&newproducts=0&ColumnSort=0&page=1&stock=0&pbfree=0&rohs=0&quantity=0&ptm=0&fid=0&pageSize=500";

$curl = curl_init();
curl_setopt_array(
    $curl,
    array(
        CURLOPT_URL                 => $url
        , CURLOPT_HEADER            => 0
        , CURLOPT_RETURNTRANSFER    => 1
    )
);

$out = curl_exec($curl);

// очистить лишние символы
$item_dan = array_map( "filt", explode("\n", $out));

// из каждой строки сделать массив по запятой снаружи кавычек
$items = array_map( "str_getcsv", $item_dan);

print_r( $items);
5
  • А как строка тут будет разделяться? Я до конца логику не могу разобрать!
    – ggLike
    2 окт 2014 в 13:12
  • Она уже разделена : ) ["string",12,34,"string2"] – так записываются массивы в json; "string",12,34,"string2" – вполне приличная запись в CSV (формат такое, "comma-separated values - значиения, разделённые запятой. Поэтому достаточно либо приписать квадратные скобки, чтобы это стал json, который разбирается функцией php json_decode(), либо вообще ничего не дописывая разобрать строку, будто это CSV ф-ей str_getcsv(). Вы проверили, работает с остальными данными? С приведёнными в примере-то всё срабатывает.
    – Sergiks
    2 окт 2014 в 13:58
  • Да, пропадут двойные кавычки вокруг строк, поэтому ни в одном из предложенных мной вариантов вы не получите точно как в вопросе строки-с-кавычками > string '"@ qty"' (length=7) Будет string '@ qty' (length=5). Но разве вам это в итоге нужно? > как строка тут будет разделяться? Запятыми, между которыми могут быть либо числа без кавычек, либо строки в кавычках (и запятые внутри этих строк не считаются разделителем).
    – Sergiks
    2 окт 2014 в 16:24
  • Выводит пустое значение непонятно почему!
    – ggLike
    3 окт 2014 в 7:35
  • Понятно, почему: там, где return NULL значит, условие выполняется. Обновил ответ рабочим вариантом. Надо фильтровать данные - там невидимый символ идёт в начале, его приходится отфильтровывать.
    – Sergiks
    3 окт 2014 в 8:08
1

Предполагаю, что вам нужно один полученный массив в качестве ключей, второй в качестве значений.

$keys_string = 'Тут строка с индексом [0] из исходного массива';
$values_string = 'Тут строка с индексом [1] из исходного массива';

$keys = explode(',', $keys_string); // Это массив, который вы хотели получить
$values = explode(',', $values_string);

$data = array_combine($keys, $values);
print_r($data);

Результат:

Array
(
    ["Datasheets"] => "http://www.knowles.com/eng/content/download/3165/37817/version/2/file/bf-1861-000.pdf"
    ["Image"] => "http://media.digikey.com/Photos/Knowles%20Acoustics%20Photos/BF-1861-000.jpg"
    ["Digi-Key Part Number"] => "423-1158-ND"
    ["Manufacturer Part Number"] => "BF-1861-000"
    ["Manufacturer"] => "Knowles"
    ["Description"] => "ACOUSTIC DAMPER 1500 OHMS"
    ["Quantity Available"] => 1067
    ["Factory Stock"] => 0
    ["Unit Price (USD)"] => "1.67000"
    ["@ qty"] => 0
    ["Minimum Quantity"] => 1
    ["Series"] => "BF"
    ["Accessory Type"] => "Damper"
    ["Material"] => "Metal Ferrule Housing"
    ["Color"] => "Green"
    ["For Use With/Related Products"] => "Hearing Aids"
)

Посмотреть рабочий пример

Не понимаю, почему у вас строка не разбивалась корректно.

3
  • Некорректно разобьётся, если внутри кавычек окажется внезапно запятая.
    – Sergiks
    2 окт 2014 в 8:59
  • Поставь разделителем набор из симоволов ","
    – Get
    2 окт 2014 в 9:23
  • @Get, плохой совет: строка может содержать числовые значения без кавычек ("Get",21,"неправ")
    – Sergiks
    2 окт 2014 в 11:13

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.