同じことに対して異なるトリガーを設定するには、次のようにします (トリガーを簡単に追加できます)。トリガーに正規表現を配置して評価することもできますが、それは自分で理解できます;)
<?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
配列は異なって見えますが、u が言うように、ユーザーがそれらを設定します。そのため、「キッチン ライト」、「キッチン ライト」、およびユーザーが配列に追加したその他のもののすべてのケースをチェックする方法はありません。したがって、同じことに対して異なるトリガーを使用して、上記のように配列を埋めることができます。使いやすさが新しい の余分な構造を構成していると思います$sys
。^^
更新:順序付けされていない入力を許可するように更新されました。1 つのコマンドで "off" または "on" という単語のインスタンスがいくつ見つかるかわからない場合、順序付けられていない入力は扱いにくいと思います。それ以上のインスタンスがある場合、「オン」と「オフ」のどちらが正しいかを判断できなくなります。「「オン」または「オフ」の最初のインスタンスを使用する」などのルールがある可能性があります。上記のコードはそのルールを使用します。そのため、「キッチン オフ ライト オン オフ」のようなコマンドを入力すると、「キッチン ライト オン オフ」というトリガーを持つものをオフにしようとする結果になります。別の可能な方法は、"on"|"off" のインスタンスがさらにある場合にコマンドを拒否することです。または、「on」|」の複数のインスタンスをカットするには