要为同一件事设置不同的触发器,您可以执行以下操作(允许您轻松添加更多触发器)。您也可以在触发器中放置一些正则表达式并评估它们,但您可以自己弄清楚;)
<?php
define('SWITCHED_ON', 256);
define('SWITCHED_OFF', 0);
$sys = array(
'1' => array(
'name' => 'Kitchen Lights',
'triggers' => array(
'kitchen light',
'kitchen lights',
),
),
'2' => array(
'name' => 'Living Lights',
'triggers' => array(
'living lights',
'lights in living room',
'light in living room',
),
),
'3' => array(
'name' => 'Living Fan',
'triggers' => array(
'living fan',
'fan in living room',
),
),
);
$input = array('off kitchen lights','on living fan');
$output = array();
foreach ( $input as $command ) {
// split command at first whitespace
// $command_array = preg_split('%\s+%', $command, 2);
// update to allow input like $input = array('kitchen off lights','living fan on');
$split = preg_split('%\s+%', $command);
$input_switch = false;
$input_trigger = array();
foreach ( $split as $part ) {
if ( $input_switch === false ) {
switch ( $part ) {
case 'on': $input_switch = SWITCHED_ON; break;
case 'off': $input_switch = SWITCHED_OFF; break;
default: $input_trigger[] = $part; break;
}
} else {
$input_trigger[] = $part;
}
}
if ( $input_switch === false || empty($input_trigger) ) {
continue;
}
$input_trigger = implode(' ', $input_trigger);
// insert check if command is valid (for example contains only spaces and alphanumerics.. etc..)
// ...
foreach ( $sys as $syskey => $conf ) {
foreach ( $conf['triggers'] as $trigger ) {
if ( $trigger == $input_trigger ) {
$output[] = $syskey.':'.$input_switch;
continue 3; // continue outer foreach
}
}
}
// if you arrive here, the command was not found in sys
}
$output = implode(',', $output);
echo $output;
PS:$sys
阵列看起来不同,但正如你所说的用户设置它们。因此,无法检查所有“厨房灯”、“厨房灯”以及用户放入数组中的其他内容。所以他们可以像上面一样填充数组,对同一件事使用不同的触发器。我认为易用性构成了新的$sys
. ^^
更新:更新以允许无序输入。我认为无序输入有点难以处理,如果您不能确定在一个命令中找到了多少个“off”或“on”这个词的实例。如果有更多实例,您将无法确定哪个“开”或“关”是正确的。可能有一个规则......比如“第一个“开”或“关”的实例是我们将使用的那个”或其他东西。上面的代码将使用该规则。因此,如果您输入诸如“厨房关灯开关”之类的命令,它将导致尝试关闭具有触发“厨房灯开关”的东西。如果有更多“on”|“off”的实例,另一种可能的方法是拒绝该命令。或剪切多个“on”|”实例