带有多维数组的stripos

时间:2011-12-03 11:57:26

标签: php arrays strpos

我正在尝试编写一个php函数来搜索引用页面中的术语,然后根据这些术语的存在执行一个函数。

创建基本代码不是问题,但是使用相当多的单词和可选操作,对于每组单词/函数,脚本使用单独的行会变得很长。基本代码概念如下。 stripos函数与首选项的顺序相反,因此如果出现两个或多个术语,那么最重要的术语是最后一个并且将超过之前的术语

(我想可能有一种方法可以在满足第一个条件后退出脚本,但我的退出实验失败了,所以我只使用反向排序)

group1 = array("word1","word2","word3","word4","word5");
group2 = array("word6","word7","word8");
group3 ... etc

foreach($group1 as $groupa) { if(stripos($string, $groupa) !== false) { do something A; }  }
foreach($group2 as $groupb) { if(stripos($string, $groupb) !== false) { do something B; }  }
foreach ... etc

有没有办法使用二维数组或两个数组,一个是单词,一个是动作?即:

words = array("word1","word2","word3","word4","word5","word6","word7","word8")
actions = array("something A","something A","something A","something A","something A","something B","something B","something B")

foreach($words as $word) { if(stripos($string, $word) !== false) { do actions; }  }

......更新......

受Phillips建议的启发,我们最终得到了一个多维数组,然后逐步完成了它的“行”。现在正致力于从MySQL中获取数组,而不是在代码中写出来。

$terms = array( 
array( "word" => "word1", 
      "cat" => "dstn",
      "value" => "XXXX" 
    ),
    ..etc
    ..etc
);
foreach ($terms as $i => $row)  
{ if(stripos($refstring3, $row['word']) !== false) { $$row['cat'] = $row['value']; }  }

......更新......

它已演变为一个简单的MySQL查询,后跟一个while语句而不是foreach。由于反馈和Stackoverflow上的各种其他帖子,它就像一个魅力。

感谢所有人。

这个地方非常适合学习和理解,帖子直接跳到事物的内容,并且不必搜索大量相关但不适用的教程。

2 个答案:

答案 0 :(得分:0)

您可以将单词操作存储为

形式的键值数组
$actionsForWord = array("myAction" => "myword", "myAction2" => "myword2");

然后浏览这些并使用Eval和字符串连接来调用函数:http://php.net/manual/en/function.eval.php

但是,如果您告诉我们更多关于您实际想要实现的目标 - 例如,您希望采取哪些行动的例子,基于什么词? - 可能有更好,更清晰的方法来组织您的代码。请记住,Eval需要通过永不传递用户内容来保护,因此只能使用您自己的“白名单”命令。

答案 1 :(得分:0)

尽管Philipp Lenssen给出的答案肯定是正确的(并且已被接受)并且可行,但我真的不喜欢使用eval执行功能的想法。你可以试试这个;

<?php
function search( $content, $actions ) {
    foreach( $actions as $action => $terms ) {
        foreach( $terms as $term ) {
            if( stripos( $content, $term ) !== false ) {
                /* Match found, perform $action, and return. */
                return $action( strtolower( $term ) );
            }
        }
    }
    return false;
}

function foo( $term ) {
    return "foo(): Found the term '{$term}'.";
}

function bar( $term ) {
    return "bar(): Found the term '{$term}'.";
}


$tests = array(
    'This is text containing term 1' => "foo(): Found the term 'term 1'.",
    'term 2 is in this text' => "foo(): Found the term 'term 2'.",
    'Capitals work, TERM 3' => "bar(): Found the term 'term 3'.",
    'No correct term to be found here' => false
);

$actions = array(
    'foo' => array(
        'term 1',
        'term 2'
    ),
    'bar' => array(
        'term 3'
    )
);

foreach( $tests as $content => $expected ) {
    $result = search( $content, $actions );
    echo $result . ( $result === $expected ? ' (CORRECT)' : ' (FALSE)' ) . PHP_EOL;
}

确实没有必要使用eval,我强烈建议反对它。