PHP试图通过关键字设置类别无错误和空标记
我试图通过产品类别名称中的特定关键字创建XML提要,并从.csv获取这些数据,一切正常。。唯一的问题是将类别分配到xml提要中 .csv目录的链接: 分配条件:PHP试图通过关键字设置类别无错误和空标记,php,xml,keyword,Php,Xml,Keyword,我试图通过产品类别名称中的特定关键字创建XML提要,并从.csv获取这些数据,一切正常。。唯一的问题是将类别分配到xml提要中 .csv目录的链接: 分配条件: $catalog_name = 'catalog.csv'; $file_url = 'https://ociostock.gesio.be/dyndata/exportaciones/csvzip/catalog_1_51_54_2_38849185cc8487a046bd2bf4a46de0ed_csv_plain.csv'; fi
$catalog_name = 'catalog.csv';
$file_url = 'https://ociostock.gesio.be/dyndata/exportaciones/csvzip/catalog_1_51_54_2_38849185cc8487a046bd2bf4a46de0ed_csv_plain.csv';
file_put_contents($catalog_name, fopen($file_url, 'r'));
$categories = [
'facemask' => 'mascarillas',
'mascarilla' => 'mascarillas',
'mask' => 'mascarillas',
'juego' => 'juguetes',
'playdoh' => 'juguetes',
'puzzle' => 'juguetes',
'monopoly' => 'juguetes',
'notebook' => 'papeleria',
'pencil' => 'papeleria',
'pencil case' => 'papeleria',
'bag' => 'otros',
'schoolbag' => 'otros',
'rucksack' => 'otros',
'quokka' => 'otros',
'mug' => 'otros',
'bottle' => 'otros',
'towel' => 'otros',
'funko' => 'colleccionables',
];
$dom = new DOMDocument();
$dom->encoding = 'utf-8';
$dom->xmlVersion = '1.0';
$dom->formatOutput = true;
$xml_file_name = 'products.xml';
$root = $dom->createElement('SHOP');
$flag = true;
$h = fopen($catalog_name, 'r');
while (($data = fgetcsv($h, 30000, ';')) !== FALSE)
{
if($flag) {
$flag = false;
continue;
}
$item_node = $dom->createElement('SHOPITEM');
$name = $data[3];
$description = $data[5];
$price = $data[8] * 1.30 * 1.21;
$rounded_price = round($price, 2);
$active = $data[13];
$stock = $data[15];
$ean = $data[19];
$img_url = $data[22];
$units_per_order = $data[24];
$trimmed_ean = utf8_decode($ean);
if ($units_per_order != "1") {
$active = "0";
$stock = "0";
}
if ($active != "1" || $units_per_order != "1") {
continue;
}
$category = $categories[$name] ?? '';
var_dump($category);
$item_node->appendChild($dom->createElement('PRODUCTNAME', htmlspecialchars($name)));
$item_node->appendChild($dom->createElement('DESCRIPTION', htmlspecialchars($description)));
$item_node->appendChild($dom->createElement('PRICE_VAT', strval($rounded_price)));
$item_node->appendChild($dom->createElement('IMG_URL', strval($img_url)));
$item_node->appendChild($dom->createElement('EAN', strval($trimmed_ean)));
$item_node->appendChild($dom->createElement('STOCK', strval($stock)));
$item_node->appendChild($dom->createElement('ACTIVE', strval($active)));
$item_node->appendChild($dom->createElement('CATEGORYTEXT', htmlspecialchars($category)));
$root->appendChild($item_node);
}
fclose($h);
$dom->appendChild($root);
$dom->save($xml_file_name);
这里我附加了一个函数,使CATEGORYTEXT具有上面条件块中的category名称。。所以,如果某个关键字在$name变量中,那么它应该根据条件设置$category变量
但是,正如您所看到的,我的XML提要中的每个产品都有空的CATEGORYTEXT标记,例如,第一个产品的名称中有关键字“瓶子”,那么为什么CATEGORYTEXT标记为空?您的条件不起作用。见:
$name = 'facemask';
var_dump(
strpos($name, 'facemask' || 'mascarilla' || 'mask')
);
输出:
bool(false)
bool(true)
assorted A5 notebook: stationary
premium adult t-shirt: clothes
adult premium t-shirt: clothes
Daisy figure: doll
Cars Pencil case: stationary
Cars Pole Gym bag 35cm:
<?xml version="1.0"?>
<CATEGORYTEXT>mascarillas</CATEGORYTEXT>
这是因为您的参数的计算结果为true:
var_dump('facemask' || 'mascarilla' || 'mask');
输出:
bool(false)
bool(true)
assorted A5 notebook: stationary
premium adult t-shirt: clothes
adult premium t-shirt: clothes
Daisy figure: doll
Cars Pencil case: stationary
Cars Pole Gym bag 35cm:
<?xml version="1.0"?>
<CATEGORYTEXT>mascarillas</CATEGORYTEXT>
我建议用地图。但是由于每个类别都允许在$name
中包含多个子字符串,因此这有点复杂,因此让我们定义一个封装逻辑的小类:
class CategoryMatcher {
private $_map;
public function __construct(array $map) {
$this->_map = $map;
}
public function match(string $text): ?string {
$text = strtolower($text);
foreach ($this->_map as $category => $subStrings) {
if ($this->containsOneOf($text, $subStrings)) {
return $category;
}
}
return NULL;
}
private function containsOneOf(string $text, array $subStrings): bool {
foreach ($subStrings as $subString) {
if (FALSE !== strpos($text, $subString)) {
return TRUE;
}
}
return FALSE;
}
}
$matcher = new CategoryMatcher(
[
'doll' => ['figure'],
'clothes' => ['t-shirt'],
'stationary' => ['notebook', 'pencil case']
]
);
$examples = [
'assorted A5 notebook',
'premium adult t-shirt',
'adult premium t-shirt',
'Daisy figure',
'Cars Pencil case',
'Cars Pole Gym bag 35cm'
];
foreach ($examples as $example) {
echo $example, ': ', $matcher->match($example), "\n";
}
输出:
bool(false)
bool(true)
assorted A5 notebook: stationary
premium adult t-shirt: clothes
adult premium t-shirt: clothes
Daisy figure: doll
Cars Pencil case: stationary
Cars Pole Gym bag 35cm:
<?xml version="1.0"?>
<CATEGORYTEXT>mascarillas</CATEGORYTEXT>
此外,请注意DOMdocument::createElement()
的第二个参数-如果变量包含的&
不是有效实体的一部分,则该参数将中断。最好使用DOMNode::$textContent
$document = new DOMDocument();
$document
->appendChild($document->createElement('CATEGORYTEXT'))
->textContent = 'mascarillas';
echo $document->saveXML();
输出:
bool(false)
bool(true)
assorted A5 notebook: stationary
premium adult t-shirt: clothes
adult premium t-shirt: clothes
Daisy figure: doll
Cars Pencil case: stationary
Cars Pole Gym bag 35cm:
<?xml version="1.0"?>
<CATEGORYTEXT>mascarillas</CATEGORYTEXT>
眼睑
Hi,请按照您的说明操作。。每个产品都会抛出以下内容:字符串(0)”,因此我编辑了代码以进行检查。。那么,您认为问题出在哪里?如果您在问题中包含CSV数据样本,我可能能够回答。我认为问题将出现在条件中,因为当我只有一个条件If-else块只检查mascarilla类别时,它工作得很好,但我向.CSV目录添加了完整的代码+链接。