列出所有terms的token

Token自定义插件示例
本文介绍了一个使用token_custom插件定义特定token的示例。通过遍历节点的分类信息,将所有分类名称收集到数组中,并用特定格式合并成一个字符串。此方法可用于动态生成基于内容的标记。
装上token_custom插件



定义一个token为:

// For all taxonmoy terms
$my_value = array();
foreach ($node->taxonomy as $tid => $term) {
$my_value[] = $term->name;
}
$yourtoken = implode(' ', $my_value);
print $yourtoken;
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #define SIZE 4 #define EPS 1e-9 // 浮点数精度控制 // 解析表达式并生成4×4浮点矩阵(1.0表示线性项,2.0表示非线性项) void exprToMatrix(const char* exprs[4], double matrix[SIZE][SIZE]) { // 初始化矩阵为全0 for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { matrix[i][j] = 0.0; } } // 处理每个表达式 for (int i = 0; i < SIZE; i++) { const char* expr = exprs[i]; char temp[100]; strcpy(temp, expr); // 查找等号位置,只处理等号右侧的部分 char* equalSign = strchr(temp, '='); if (equalSign == NULL) continue; char* rightPart = equalSign + 1; // 解析右侧部分,查找所有X0-X3的出现 char* token = strtok(rightPart, "^+ "); // 以^、+和空格作为分隔符 while (token != NULL) { // 检查是否是非线性项 F(Xj) if (strncmp(token, "F(X", 3) == 0 && token[4] == ')') { char xNum = token[3]; if (isdigit(xNum) && xNum >= '0' && xNum <= '3') { int j = xNum - '0'; matrix[i][j] = 2.0; // 非线性项标记为2.0 } } // 检查是否是线性项 Xj else if (strncmp(token, "X", 1) == 0) { char xNum = token[1]; if (isdigit(xNum) && xNum >= '0' && xNum <= '3' && token[2] == '\0') { int j = xNum - '0'; matrix[i][j] = 1.0; // 线性项标记为1.0 } } token = strtok(NULL, "^+ "); } } } // 交换增广矩阵的两行 void swapRows(double aug[SIZE][2*SIZE], int row1, int row2) { double temp; for (int j = 0; j < 2*SIZE; j++) { temp = aug[row1][j]; aug[row1][j] = aug[row2][j]; aug[row2][j] = temp; } } // 初等行变换求逆矩阵并按规则处理值(0保持0,1保持1,其他设为2) void matrixInverse(double mat[SIZE][SIZE], double inv[SIZE][SIZE]) { // 初始化增广矩阵 [原矩阵 | 单位矩阵] double aug[SIZE][2*SIZE] = {{0.0}}; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { aug[i][j] = mat[i][j]; // 使用浮点型原矩阵 } aug[i][i + SIZE] = 1.0; // 右侧:单位矩阵 } // 逐列进行初等行变换 for (int col = 0; col < SIZE; col++) { // 1. 寻找当前列的主元行(从当前行开始的第一个非零元素) int pivotRow = -1; for (int row = col; row < SIZE; row++) { if (fabs(aug[row][col]) > EPS) { // 非零判断(考虑浮点数误差) pivotRow = row; break; } } // 交换当前行与主元行(确保主元在对角线上) if (pivotRow != -1 && pivotRow != col) { swapRows(aug, col, pivotRow); } // 2. 主元归一化(当前行除以主元,使对角元素为1) double pivot = aug[col][col]; if (fabs(pivot) < EPS) { // 处理奇异矩阵(无逆矩阵) fprintf(stderr, "矩阵不可逆,无法计算逆矩阵\n"); exit(1); } for (int j = col; j < 2*SIZE; j++) { aug[col][j] /= pivot; } // 3. 消去其他行的当前列元素(使其为0) for (int row = 0; row < SIZE; row++) { if (row != col && fabs(aug[row][col]) > EPS) { double factor = aug[row][col]; // 消元系数 for (int j = col; j < 2*SIZE; j++) { aug[row][j] -= factor * aug[col][j]; } } } } // 提取右侧部分作为逆矩阵,并按规则处理值 // 规则:0保持0,1保持1,其他值(非0非1)统一设为2 for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { double val = fabs(aug[i][j + SIZE]); // 先取绝对值 if (fabs(val) < EPS) { inv[i][j] = 0.0; // 0值保持 } else if (fabs(val - 1.0) < EPS) { inv[i][j] = 1.0; // 1值保持 } else { inv[i][j] = 2.0; // 其他值统一设为2 } } } } // 将浮点矩阵转换为4个分支密码表达式(直接使用处理后的1或2值) void matrixToExpressions(double matrix[SIZE][SIZE], char expressions[4][100]) { // 处理每个Yi对应的表达式 for (int i = 0; i < SIZE; i++) { // 初始化表达式前缀 "Yi = " sprintf(expressions[i], "Y%d = ", i); char terms[100] = ""; // 用于拼接各项 // 遍历列,收集所有项(按X0到X3的顺序) for (int j = 0; j < SIZE; j++) { // 直接使用处理后的整数值(1为线性项,2为非线性项) int val = (int)round(matrix[i][j]); // 这里round可简化为直接强转,因为值只可能是0/1/2 if (val == 1) { // 线性项 if (strlen(terms) > 0) { strcat(terms, "^"); // 已有项则添加连接符 } char term[5]; sprintf(term, "X%d", j); strcat(terms, term); } else if (val == 2) { // 非线性项 if (strlen(terms) > 0) { strcat(terms, "^"); // 已有项则添加连接符 } char term[8]; sprintf(term, "F(X%d)", j); strcat(terms, term); } } // 将拼接好的项添加到表达式中 strcat(expressions[i], terms); } } // 读取用户输入的4个表达式 int inputExpressions(char expressions[4][100]) { printf("请输入4个表达式(格式如Y0 = X1^F(X0)):\n"); for (int i = 0; i < SIZE; i++) { if (fgets(expressions[i], sizeof(expressions[i]), stdin) == NULL) { printf("输入错误:无法读取第%d个表达式\n", i+1); return 0; } // 去除换行符 size_t len = strlen(expressions[i]); if (len > 0 && expressions[i][len-1] == '\n') { expressions[i][len-1] = '\0'; } } return 1; } int main() { char inputExprs[4][100]; // 存储输入的表达式 const char* exprs[4]; // 指向输入表达式的指针数组 double mat[SIZE][SIZE]; // 表达式转换后的矩阵(浮点型) double invMat[SIZE][SIZE]; // 逆矩阵(浮点型) char outputExprs[4][100]; // 转换后的输出表达式 // 读取输入表达式 if (!inputExpressions(inputExprs)) { return 1; } for (int i = 0; i < SIZE; i++) { exprs[i] = inputExprs[i]; } // 表达式转矩阵(浮点型) exprToMatrix(exprs, mat); // 求逆矩阵并按规则处理值 matrixInverse(mat, invMat); // 矩阵转表达式 matrixToExpressions(invMat, outputExprs); // 输出结果 printf("\n转换结果:\n"); for (int i = 0; i < SIZE; i++) { printf("%s\n", outputExprs[i]); } return 0; }
最新发布
10-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值