Как сравнить массив строк с числовым массивом? - PullRequest
0 голосов
/ 02 сентября 2018

Уважаемые пользователи StackOverflow. Есть какая-то проблема.

Array 1:
array: 3 [▼
   0 => "8"
   1 => "13"
   2 => "15"
]

Array 2:
array: 16 [▼
   0 => 7
   1 => 8
   2 => 9
]

array_diff не работает, потому что в первом числе во второй строке.

Пожалуйста, предложите любые идеи для решения проблемы. Буду рад любому комментарию. Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Вы можете конвертировать массивы, используя карту массива, как это

$a1 = array_map('intval', $a1);
$a2 = array_map('intval', $a2);

Тогда сделайте ваш массив разным, а что нет.

@ Решение Ника более элегантно.

Потому что массивы не идут в 2 раза больше, чем вам действительно нужно. Конечно, если вы знаете, что такое строка, вы можете просто конвертировать ее, но я подумал, что выложу другой способ сделать это ...

Для тестирования вы можете просто сделать это

$a = [
    "1",
    "2" ,
    "3"
];

var_dump($a);

var_dump(array_map('intval', $a));

Выход

array(3) {
  [0]=> string(1) "1"
  [1]=> string(1) "2"
  [2]=> string(1) "3"
}

array(3) {
  [0]=> int(1)
  [1]=> int(2)
  [2]=> int(3)
}

Песочница

И это показывает, что он конвертирует значения в строку, что было довольно очевидно, но мне нравятся примеры. Итак, поехали.

Ура!

UPDATE

После того, как мы выполнили простую разметку с массивом из 100 000 строковых чисел и взяли среднее время из 100 итераций, понадобилось приблизительно 0,0072 в секунду, чтобы преобразовать массив обратно в целые числа:

//setup
$a = array_map('strval', range(0, 100000));

//get microtime as float after setup
$time = microtime(true);

//use the average of 100 conversion for consistency
$iterations = 100;

for($i=0;$i<$iterations; ++$i){
  $b = array_map('intval', $a); //set to $b so we don't convert $a on our first iteration.

  //check the first iteration, to make sure we have it setup correctly for our averaging
  if($i==0)
    echo number_format(
        ((microtime(true) - $time)),
       4
    )." \seconds\n\n";
}

echo number_format(
    ((microtime(true) - $time) / $itterations),
    4
)." \seconds\n";

выход

0.0067 \seconds
//if these are close (which they are) we have everything setup right,
//it's better to take the average for speed testing.
//and I just wanted to double check that it was being done correctly
0.0072 \seconds

Песочница

-note- в песочнице всего 134 Мб оперативной памяти для PHP (я специально выбрал ее из памяти, чтобы проверить это .. смеется)

<b>Fatal error</b>:  Allowed memory size of 134217728 bytes exhausted

Update1

Было отмечено, что желаемый вывод не был указан, поэтому вот как получить все уникальные значения:

Если вы хотите уникальные значения из обоих массивов, вы можете сделать

  $unique = array_unique(array_replace($a1,$a2));

И если массивы заранее уникальны, вы можете просто сделать array_replace, потому что вы будете объединять 2 уникальных массива, заменяя любые в одном массиве, которые дублируются в другом. Поэтому результатом будет уникальная комбинация из 2 уникальных массивов, если это имеет смысл.

0 голосов
/ 02 сентября 2018

Вы можете использовать array_udiff для сравнения массивов с помощью пользовательского обратного вызова, который преобразует значения в целые, прежде чем сравнивать:

$array1 = array('8', '13', '15');
$array2 = array(7, 8, 9);
$diffs = array_udiff($array1, $array2, function ($a, $b) { return (int)$a - (int)$b; });
print_r($diffs);

Выход:

Array
(
    [1] => 13
    [2] => 15
)

Обновление

Было отмечено, что желаемый вывод не был указан, поэтому вот как получить все уникальные значения:

$diffs1 = array_udiff($array1, $array2, function ($a, $b) { return (int)$a - (int)$b; });
$diffs2 = array_udiff($array2, $array1, function ($a, $b) { return (int)$a - (int)$b; });
$diffs = array_merge($diffs1, $diffs2);
print_r($diffs);

Выход:

Array
(
    [0] => 13
    [1] => 15
    [2] => 7
    [3] => 9
)

и все соответствующие значения, используя array_uintersect:

$same = array_uintersect($array1, $array2, function ($a, $b) { return (int)$a - (int)$b; });
print_r($same);

Выход:

Array
(
    [0] => 8
)

Примечание

В PHP7 теперь есть оператор космического корабля (<=>) , который также можно использовать в функции сравнения, например,

$diffs = array_udiff($array1, $array2, function ($a, $b) { return (int)$a <=> (int)$b; });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...