【问题标题】:Filtering by PHP通过 PHP 过滤
【发布时间】:2009-12-21 01:52:44
【问题描述】:

我在 column1 有一个 $data 显示:

“AAA123” “ABC1234” “ABD123” “BAC12” “CAB123” “DA125” 等等..

我想显示 $data 仅以“AB”开头,它在第 1 列显示我,例如:

“ABC1234” “ABD123”

不是其他的,还有与“ABC1234”和“ABD123”相关的其他行和列


提前感谢。

Sample structure http://img706.imageshack.us/img706/8994/34310422.jpg

【问题讨论】:

  • $data 的类型是什么?一个字符串数组? $data 是 SQL 查询的结果吗?
  • 不,我通过拆分从 txt 获取 $data
  • 那么$datas 类型是什么?一个字符串数组?数组数组?如果是后者,内部数组的结构是什么?
  • 代码截图不如代码本身有用。您还应该选择缩进样式 (en.wikipedia.org/wiki/Indent_style) 并使用它。我个人推荐 1TBS。
  • outis 也非常感谢其他人的这种关心。实际上我不知道如何写这些东西,但只能根据需要进行编辑。我想我需要学习更多的编码而不是编辑。

标签: php filter


【解决方案1】:

如果$data 是一个字符串数组,您可以使用array_filter

PHP 5.3 或更高版本:

$AB = array_filter($data, function($str) {
    return 'AB' == substr($str, 0, 2);
});

PHP 5.3 之前:

$AB = array_filter($data, 
                   create_function('$str', 
                                   'return "AB" == substr($str, 0, 2);'
                  )               );

或者:

function create_prefix_tester($prefix) {
    return create_function('$str', 
                  "return '$prefix' == substr(\$str, 0, " . strlen($prefix) . ');'
                  );
}
$AB = array_filter($data, create_prefix_tester('AB'));

或者你可以使用循环:

foreach ($data as $str) {
    if ('AB' ==  substr($str, 0, 2)) {
      // do stuff
      ...
    }
}

编辑

从示例代码看来,您需要循环:

while (FALSE !== ($line = fgets($fp))) {
    $row = explode('|', $line); // split() is deprecated
    if ('AB' == substr($row[0], 0, 2)) {
        switch($sortby) {
        case 'schools': // fallthru
        default:
            $sortValue = $row[0];
            break;
        case 'dates':
            $sortValue = $row[1];
            break;
        case 'times':
            $sortValue = $row[2];
            break;
        }
        array_unshift($row, $sortValue);
        $table[] = $row;
    }
}

或:

function cmp_schools($a, $b) {
    return strcmp($a[0], $b[0]);
}
function cmp_dates($a, $b) {
    return $a['datestamp'] - $b['datestamp'];
}
function cmp_times($a, $b) {
    return $a['timestamp'] - $b['timestamp'];
}
while (FALSE !== ($line = fgets($fp))) {
    $row = explode('|', $line); // split() is deprecated
    if ('AB' == substr($row[0], 0, 2)) {
        $when = strtotime($row[1] + ' ' + $row[2]);
        $row['timestamp'] = $when % (60*60*24);
        $row['datestamp'] = $when - $row['timestamp'];
        $table[] = $row;
    }
}
usort($table, 'cmp_' + $sortby);

【讨论】:

    【解决方案2】:

    我会简单地使用substr(),如下面的sn-p:

    if (substr($str, 0, 2) == 'AB') {
      // The string is right.
    }
    

    【讨论】:

      【解决方案3】:

      使用strpos (http://www.php.net/manual/en/function.strpos.php),点赞

      if (strpos($my_string, "AB") === 0) {
        <do stuff>
      }
      

      请务必使用=== 而不是==,因为如果找不到“AB”,则该函数将返回false,这相当于使用== 为0。

      【讨论】:

      • 我认为这是最接近的回复。现在我有关于我的查询的确切行数 - 这意味着“strpos”正在工作 - 但整个表(行和列)变为空。有什么想法吗?
      猜你喜欢
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 2012-02-02
      相关资源
      最近更新 更多