Я новичок в 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);
Комментариев нет:
Отправить комментарий