Многозначный поиск в многомерном массиве, не возвращающий ожидаемый результат в PHP - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь создать функцию, которая позволяет искать многомерные массивы, где каждый подмассив соответствует нескольким условиям. Я сталкиваюсь со странным поведением и не могу понять, почему это происходит.

Ниже приводится общая логика c, которая вызывает проблему. Я запускаю это на PHP 7.4 для чего это стоит. Ожидается, что последний массив ключей ($keys2) будет соответствовать первому массиву ключей ($keys), но вместо этого он теряет связь с ожидаемыми индексами. Похоже, что PHP игнорирует мои данные индексы int и вместо этого использует невидимые 0-индексированные индексы в последнем вызове array_keys().

$array = [
    ['one' => 'aa', 'two' => 'qq'],
    ['one' => 'bb', 'two' => 'qq'],
    ['one' => 'aa', 'two' => 'qq'],
    ['one' => 'bb', 'two' => 'qq'],
    ['one' => 'aa', 'two' => 'qq'],
];

$keys = array_keys(array_column($array, 'one'), 'aa');
$array2 = array_filter($array, static function($key) use ($keys) {
    return in_array($key, $keys, true);
}, ARRAY_FILTER_USE_KEY);
$keys2 = array_keys(array_column($array2, 'two'), 'qq');

echo '';
var_dump($array, $keys, $array2, $keys2);
echo '
';

Вышеуказанные выходы:

/var/www/test.php:
array (size=5)
  0 => 
    array (size=2)
      'one' => string 'aa' (length=2)
      'two' => string 'qq' (length=2)
  1 => 
    array (size=2)
      'one' => string 'bb' (length=2)
      'two' => string 'qq' (length=2)
  2 => 
    array (size=2)
      'one' => string 'aa' (length=2)
      'two' => string 'qq' (length=2)
  3 => 
    array (size=2)
      'one' => string 'bb' (length=2)
      'two' => string 'qq' (length=2)
  4 => 
    array (size=2)
      'one' => string 'aa' (length=2)
      'two' => string 'qq' (length=2)
/var/www/test.php:
array (size=3)
  0 => int 0
  1 => int 2
  2 => int 4
/var/www/test.php:27:
array (size=3)
  0 => 
    array (size=2)
      'one' => string 'aa' (length=2)
      'two' => string 'qq' (length=2)
  2 => 
    array (size=2)
      'one' => string 'aa' (length=2)
      'two' => string 'qq' (length=2)
  4 => 
    array (size=2)
      'one' => string 'aa' (length=2)
      'two' => string 'qq' (length=2)
/var/www/test.php:
array (size=3)
  0 => int 0
  1 => int 1
  2 => int 2

1 Ответ

1 голос
/ 14 апреля 2020
<code><?php 

$array = [
    ['one' => 'aa', 'two' => 'qq'],
    ['one' => 'bb', 'two' => 'qq'],
    ['one' => 'aa', 'two' => 'qq'],
    ['one' => 'bb', 'two' => 'qq'],
    ['one' => 'aa', 'two' => 'qq'],
];

$keys = array_keys(array_column($array, 'one'), 'aa');
$array2 = array_filter($array, static function($key) use ($keys) {
    return in_array($key, $keys, true);
}, ARRAY_FILTER_USE_KEY);

$keys2 = array_keys(array_combine(array_keys($array2), array_column($array2, 'two')), 'qq', true);

echo '<pre>';
var_dump($array, $keys, $array2, $keys2);
echo '
';
...