PHP试图通过关键字设置类别无错误和空标记

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

我试图通过产品类别名称中的特定关键字创建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';
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目录添加了完整的代码+链接。