Как получить правильную запись из массива, который имеет несколько записей с похожими именами -PHP - PullRequest
0 голосов
/ 25 февраля 2019

Я получаю данные от службы, касающиеся сведений о продукте. Массив для одного продукта структурирован следующим образом, с большим количеством данных, когда я анализирую данные CSV и print_r одну запись.

 [Product_name] => Product1
 [Manufacturer] => Manufacturer
 <<more elements>>
 [Image URL #1] => http://www.image1.jpg
 [Image Label #1] => PRODUCT_IMAGE
 [Image_info Label #1] => Marketing Image High Res
 [Image URL #2] => https://www.image2.jpg
 [Image Label #2] =>PRODUCT_IMAGE
 [Image_info Label #2] =>Mobile Image
 [Image URL #3] =>https://www.image3.jpg
 [Image Label #3] => PRODUCT_IMAGE
 [Image_info Label #3] => Marketing Image High Res

мне нужно взять сначалаизображение приходит в виде изображения продукта и маркетинга изображения с высоким разрешением.это не всегда изображение URL № 1.Как правильно определить URL для показа?Могу ли я использовать регулярные выражения, чтобы сделать это?

Вот пример CSV

 Item ID,Brand Name,Manufacturer,Short Name,Long Name,Storage Temp From,Gross Weight,Gross Weight UOM,Net Weight,Net Weight UOM,Catch Weight,Height,Image URL #1,Image Label #1,Image_info Label #1,Image URL #2,Image Label #2,Image_info Label #2,Image URL #3,Image Label #3,Image_info Label #3,Image URL #4,Image Label #4,Image_info Label #4,Image URL #5,Image Label #5,Image_info Label #5
    2056434,CONTINENTAL MILLS VALUE,CONTINENTAL MILLS INC.,CM VALUE BTMK BISCUIT,CONTINENTAL MILLS VALUE BUTTERMILK BISCUIT,32,51.5,LBR,50,LBR,No,5,http:// example.com/Buttermilk_Biscuit.jpg,PRODUCT_IMAGE,Marketing Image High Res,https:// example.com/image2.jpg,PRODUCT_IMAGE,Sell Sheet / Mobile Image,https:// example.com/image3.jpg,PRODUCT_IMAGE,Marketing Image High Res,https:// example.com/image4.jpg,PRODUCT_IMAGE,Case Image,https:// example.com/image5.jpg,CHILD_NUTRITION_LABEL,Marketing Image High Res
    2056463,CONTINENTAL MILLS VALUE,CONTINENTAL MILLS INC.,CM VALUE BTMK BISCUIT,CONTINENTAL MILLS VALUE BUTTERMILK BISCUIT,32,51.5,LBR,50,LBR,No,5,http:// example.com/Buttermilk_Biscuit.jpg,PRODUCT_IMAGE,Marketing Image High Res,https:// example.com/image2.jpg,PRODUCT_IMAGE,Sell Sheet / Mobile Image,https:// example.com/image3.jpg,PRODUCT_IMAGE,Marketing Image High Res,https:// example.com/image4.jpg,PRODUCT_IMAGE,Case Image,https:// example.com/image5.jpg,CHILD_NUTRITION_LABEL,Marketing Image High Res

Ответы [ 2 ]

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

Вы можете пройтись по вашему массиву, отыскивая метки изображения, которые имеют значение PRODUCT IMAGE, а затем проверяя, является ли соответствующая метка информации об изображении Marketing Image High Res.Если это так, мы разрываем цикл и выводим соответствующее значение URL изображения:

for ($i = 1; ; $i++) {
    if (!isset($input["Image Label #$i"])) break;
    if ($input["Image Label #$i"] == 'PRODUCT_IMAGE') {
        if ($input["Image_info Label #$i"] == 'Marketing Image High Res') break;
    }
}
if (isset($input["Image Label #$i"])) {
    echo $input["Image URL #$i"];
}

Вывод:

http://www.image1.jpg

Демонстрация на 3v4l.org

Если вы не можете гарантировать, что номера меток изображения начинаются с 1 и являются последовательными, другое, более сложное решение, которое будет работать в этой ситуации, выглядит следующим образом:

Вот один из способов сделать то, что вы хотите,Мы используем array_keys, чтобы найти все элементы, которые имеют PRODUCT_IMAGE в качестве значения, а затем array_map, чтобы убрать все, кроме числа из этих значений.В этом случае мы получаем массив [1, 2, 3].Затем мы делаем тот же процесс для Marketing Image High Res, получая [1, 3].Затем мы берем минимум пересечения двух массивов, который является самым низким изображением, которое является PRODUCT_IMAGE и Marketing Image High Res, в данном случае 1.Наконец, мы выводим соответствующий URL, комбинируя это значение с 'Image URL #':

$product_images = array_map(function ($v) { return preg_replace('/^.*#/', '', $v); }, array_keys($input, 'PRODUCT_IMAGE'));
$highres_images = array_map(function ($v) { return preg_replace('/^.*#/', '', $v); }, array_keys($input, 'Marketing Image High Res'));
$min_key = min(array_intersect($product_images, $highres_images));
echo $input["Image URL #$min_key"];

Вывод:

http://www.image1.jpg

Демонстрация на 3v4l.org

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

Цикл по всем ключам и поиск первого вхождения PRODUCT_IMAGE в качестве значения.Затем используйте preg_match, чтобы получить идентификатор в ключе, чтобы получить соответствующее поле URL:

$image = null;
foreach ($array as $key => $value) {
    $match = null;
    if (preg_match('/^Image Label #(\d+)$/', $key, $match) && $value === 'PRODUCT_IMAGE') {
        $image = $array['Image URL ' . $match[1]];
        break;
    }
}
echo $image;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...