搜索嵌套的多维数组


Search nested multidimensional array

我有一个填充数组的函数:

foreach ($request->get('ids') as $id) {
    $pdfArray['other']++; // Yes this is initialized
    $pdfArray['rows'][$i]['id'] = $schedule->getId();
    $pdfArray['rows'][$i]['date'] = $schedule->getStart()->format('d.m.Y');
    $pdfArray['rows'][$i]['dateSort'] = $schedule->getStart()->format('Y-m-d H:i');
    $pdfArray['rows'][$i]['from'] = $schedule->getStart()->format('H:i');
    $pdfArray['rows'][$i]['to'] = $schedule->getEnd()->format('H:i');
    $pdfArray['rows'][$i]['desc'] = $schedule->getDescription();
}

我想做什么

在每个循环中,我想检查数组(到目前为止)是否已经有一个等于当前$schedule->getDescription()desc条目,并且与$schedule->getStart()->format('d.m.Y')相同的date(实际上更多,但让我们保持简单)

我尝试了什么

public function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;
        if($needle===$value OR (is_array($value) && $this->recursive_array_search($needle,$value) !== false)) {
            return $current_key;
        }
    }
    return false;
}

我是这样使用它的:

if ($this->recursive_array_search($schedule->getDescription(), $pdfArray['rows']) &&
    $this->recursive_array_search($schedule->getStart()->format('d.m.Y'), $pdfArray['rows'])){
       $pdfArray['ma'][$schedule->getId()]++;
}

但是当任何startdesc位于当前数组中的某个位置时,这是true的。

如何检查是否找到desc并且start处于相同的$i级别?

例如编辑

假设我有 10 $id 秒要循环。循环 2 次后,$pdfArray如下所示:

Array
(
[other] => 2
[rows] => Array
    (
        [0] => Array
            (
                [id] => 1
                [date] => 13.07.2016
                [dateSort] => 2016-07-13 08:00
                [from] => 08:00
                [to] => 09:00
                [desc] => TEST
            )
        [1] => Array
            (
                [id] => 2
                [date] => 12.07.2016
                [dateSort] => 2016-07-12 08:00
                [from] => 08:00
                [to] => 09:00
                [desc] => TEST
            )
    )

下一次迭代具有以下内容:

$schedule->getStart()->format('d.m.Y') => 12.07.2016

$schedule->getDescription() => TEST

所以我想得到数组中已经存在组合的信息。

$schedule->getStart()->format('d.m.Y') => 12.07.2016

$schedule->getDescription() => TEST2

在检查它是否存在时不应返回 true。

要测试"重复项",您可以使用此函数:

function testPresence($pdfArray, $desc, $date) {
    foreach ($pdfArray["rows"] as $row) {
        if ($row["desc"] == $desc && $row["date"] == $date) return true;
    }
}

使用示例:

echo testPresence($pdfArray, "TEST2", "12.07.2016") ? "Found" : "Not found"; // Not found
echo testPresence($pdfArray, "TEST", "12.07.2016") ? "Found" : "Not found"; // Found

在原始循环中,您可以按如下方式使用它:

foreach ($request->get('ids') as $id) {
    if (testPresence($pdfArray, $schedule->getDescription(), 
                                $schedule->getStart()->format('d.m.Y')) {
        // We have a duplicate. Maybe skip this entry?:
        continue;
    }
    $pdfArray['other']++;
    $pdfArray['rows'][$i]['id'] = $schedule->getId();
    $pdfArray['rows'][$i]['date'] = $schedule->getStart()->format('d.m.Y');
    $pdfArray['rows'][$i]['dateSort'] = $schedule->getStart()->format('Y-m-d H:i');
    $pdfArray['rows'][$i]['from'] = $schedule->getStart()->format('H:i');
    $pdfArray['rows'][$i]['to'] = $schedule->getEnd()->format('H:i');
    $pdfArray['rows'][$i]['desc'] = $schedule->getDescription();
}

在你的验证函数中试试这个

    public function array_search($needle1, $needle2 ,$haystack) {
       foreach($haystack as $singleArray){  
          if (in_array($needle1, $singleArray) && in_array($needle2, $singleArray))
              return true;
           else
            continue;
        }
        return false;
    }

并像这样调用您的recursive_array_search

if ($this->array_search($schedule->getStart(), $schedule->getDescription(), $pdfArray['rows'])
continue;//Or any other kind of logic you want. At this place you know that description and date staet exist in at your array level
$pdfArray['other']++; // Yes this is initialized
$pdfArray['rows'][$i]['id'] = $schedule->getId();
$pdfArray['rows'][$i]['date'] = $schedule->getStart()->format('d.m.Y');
$pdfArray['rows'][$i]['dateSort'] = $schedule->getStart()->format('Y-m-d H:i');
$pdfArray['rows'][$i]['from'] = $schedule->getStart()->format('H:i');
$pdfArray['rows'][$i]['to'] = $schedule->getEnd()->format('H:i');
$pdfArray['rows'][$i]['desc'] = $schedule->getDescription();

函数版本:

/** 
 * Find matches for $item into pdfArray.
 * Returns an index array, possibly empty if no matches.
 * @param $item      item to find
 * @param $rows      rows where to search
 */
function findPdfArrayMatches(array $item, array $rows) {
    return array_keys(
  array_filter(
    $rows,
    function ($entry) use ($item) {
      // These are the matching criteria. More than one row may match.
      return $entry['desc'] == $item['desc']
          && $entry['date'] == $item['date']
      ;
    }
  )
);
}

你可以在循环中这样做:

$item = [
    'id'        => $schedule->getId(),
    'date'      => $schedule->getStart()->format('d.m.Y'),
    'dateSort'  => $schedule->getStart()->format('Y-m-d H:i'),
    'from'      => $schedule->getStart()->format('H:i'),
    'to'        => $schedule->getEnd()->format('H:i'),
    'desc'      => $schedule->getDescription(),
];
$matches = findPdfArrayMatches($item, $pdfArray['rows']);
if (!empty($matches)) {
    ...do something with the matches:
    foreach ($matches as $match) {
        $pdfArray['rows'][$match]['Duplicate'] = true;
    }
}
// Add new item
$pdfArray['rows'][$i] = $item;