【问题标题】:How to search in an array by value part如何按值部分在数组中搜索
【发布时间】:2020-03-06 12:59:39
【问题描述】:

我想从 api 请求中获取数据。我查询了oc52的值。获取 $date 数组。发行服务器添加 MH 前缀。它相对于名称生成自身。我正在尝试使用该类提取数组的一部分。

这是我查询时得到的数组:

$data = [
    [
        'product' => 'CH C104.12',
        'brand' => 'CH C104.12',
        'price' => 12.34,
    ],
    [
        'product' => 'MH OC52',
        'brand' => 'MH OC52',
        'price' => 56.78,
    ],
    [
        'product' => 'WX WL7074-12',
        'brand' => 'WX WL7074-12',
        'price' => 90.12,
    ],
];

这是我正在搜索的课程

class ProductFilterIterator extends \FilterIterator
{
     protected $filter;

     public function __construct(\Iterator $iterator,  $filter)
     {
         $this->filter = $filter;
         parent::__construct($iterator);
     }

     public function accept() : bool
     {
         $current = $this->getInnerIterator()->current();
         return $current['product'] == $this->filter;

     }
}

$iterator = (new \ArrayObject($data))->getIterator();
$filter1 = new ProductFilterIterator($iterator, 'OC52');

foreach ($filter1 as $data) {
    echo "<pre>";
    var_dump($data);
    echo "</pre>";
}

什么都没有反映?如果我写在 MH OC52 行:

$filter1 = new ProductFilterIterator($iterator, 'MH OC52');

然后一切正常。 前面不知道怎么实现-MH???

【问题讨论】:

  • 只是为了检查 - 是否只是检查以值结尾的字符串(例如 OC52),
  • 如何找到MH并排队:code $filter1 = new ProductFilterIterator($iterator, 'MH OC52');? code

标签: php arrays function class foreach


【解决方案1】:

如果您只想检查字符串的结尾,则存储过滤器后要检查的长度。然后在主要的accept() 方法中,它只是查看数组中字符串的最后一部分(使用substr())进行比较...

class ProductFilterIterator extends \FilterIterator
{
    protected $filter;
    protected $length;

    public function __construct(\Iterator $iterator,  $filter)
    {
        $this->filter = $filter;
        $this->length = -strlen($filter);
        parent::__construct($iterator);
    }

    public function accept() : bool
    {
        $current = $this->getInnerIterator()->current();
        return substr($current['product'], $this->length) == $this->filter;
    }
}

【讨论】:

  • 我收到一个错误 - 致命错误:无法声明类 ProductFilterIterator,因为该名称已在使用中
猜你喜欢
  • 2017-03-10
  • 2013-10-20
  • 2017-05-08
  • 1970-01-01
  • 2010-10-30
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多