полоски с многомерными массивами - PullRequest
1 голос
/ 03 декабря 2011

Я пытаюсь разработать функцию 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; }  }

...... ОБНОВЛЕНО ......

Вдохновленный предложением Филлипса, мы получили многомерный массив и затем пошагово прошли по его «строкам». Теперь работаем над извлечением массива из 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 голосов
/ 05 декабря 2011

Хотя ответ Филиппа Ленсена, безусловно, правильный (и принят) и будет работать, мне очень не нравится мысль об использовании 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, и я настоятельно рекомендую против этого.

0 голосов
/ 03 декабря 2011

Вы можете сохранить свои словесные действия как массив значений ключей в виде

$actionsForWord = array("myAction" => "myword", "myAction2" => "myword2");

, затем пройти через них и использовать Eval и конкатенацию строк для вызова функции: http://php.net/manual/en/function.eval.php

Однако, если вы расскажете нам больше о том, чего вы на самом деле хотите достичь - то есть, какие примеры действий вы хотите предпринять, на основе каких слов?- могут быть намного лучшие и более чистые способы организовать ваш код.И помните, что Eval нужно защищать, никогда не передавая ему пользовательский контент, поэтому работайте только с собственными командами из белого списка.

...