Страницы

Поиск по вопросам

воскресенье, 10 марта 2019 г.

Помогите поправить массив php

Я новичок в php... Но пытаюсь полученные данные привести к определенному виду массива..Мой скрипт извлекает данные из XML и записывает их массив в CSV файл в виде:
Array ( [Code] => 209113 [URL] => https://source.dclink.com.ua/images/490432-1.jpg ) Array ( [Code] => 209125 [URL] => https://source.dclink.com.ua/images/489002-new.jpg ) Array ( [Code] => 205366 [URL] => https://source.dclink.com.ua/images/477802-new.jpg ) Array ( [Code] => 205366 [URL] => https://source.dclink.com.ua/images/477803-new.jpg ) Array ( [Code] => 209116 [URL] => https://source.dclink.com.ua/images/493445-new.jpg )
с помощью вот такого скрипта
$start = microtime(true); $fpfinal = fopen(__DIR__.'/PicURlbyCode.csv','w+'); $headers = array ('Code','link'); fputcsv($fpfinal,$headers,';','"');
foreach(glob(__DIR__."/PicList/*.xml") as $FileName){ $items = array(); $xml = simplexml_load_file($FileName);
foreach($xml->Product as $product){
$items= get_object_vars($product);
fputcsv($fpfinal,$items,';','"');
}
} fclose($fpfinal);
echo (memory_get_usage(true)); echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';
как видите CODE повторяется а ссылки URL разные, Помогите привести массив $items к виду
Array ( [Code] => 205366 [URL] => https://source.dclink.com.ua/images/477802-new.jpg [URL2] => https://source.dclink.com.ua/images/477803-new.jpg )
как бы один код и к нему несколько ссылок...а не 1 и тот же код одна ссылка... и ЗАПИСАТЬ ВСЕ в CSV файл


Ответ

Изначально имеем следующий многомерный массив:
$array = [ ['Code' => '209113', 'URL' => 'https://source.dclink.com.ua/images/490432-1.jpg'], ['Code' => '209125', 'URL' => 'https://source.dclink.com.ua/images/489002-new.jpg'], ['Code' => '205366', 'URL' => 'https://source.dclink.com.ua/images/477802-new.jpg'], ['Code' => '205366', 'URL' => 'https://source.dclink.com.ua/images/477803-new.jpg'], ['Code' => '209116', 'URL' => 'https://source.dclink.com.ua/images/493445-new.jpg'] ];
Первый способ, он прекрасно работает, но я считаю, что он слишком запутан:
foreach ($array as $key => $value) { $new[$value['Code']][] = $value['URL']; }
foreach ($new as $key => $value) { $new[$key] = [];
foreach ($value as $k => $v) { $new[$key]['URL'.(($k + 1) > 1 ? $k + 1 : false)] = $value[$k]; } }
$i = 0;
foreach ($new as $key => $value) { $data[$i]['Code'] = $key;
foreach ($value as $k => $v) { $data[$i][$k] = $v; }
$i++; }
print_r($data);
Второй способ, более упрощенный и оптимальный вариант, как по мне:
$result = [];
foreach ($array as $row) { if (!isset($result[$row['Code']])) { $result[ $row['Code'] ] = [ 'Code' => $row['Code'], 'URL' => $row['URL'] ]; } else { $result[$row['Code']]['URL'.count($result[$row['Code']])] = $row['URL']; } }
$result = array_values($result);
print_r($result);

Комментариев нет:

Отправить комментарий