2016-08-11 2 views
3

Я использую следующий код, чтобы получить разницу между двумя массивами. Но, как кажется, сейчас он удаляет слишком много элементов, или я делаю что-то неправильно.array_diff() удаляет слишком много элементов

Я ожидаю, что выход будет array(333, 111), потому что элемент 111 появляется два раза в первом массиве и только один раз во втором. Итак, 1x 111 должен быть на выходе. Но на данный момент 111 полностью отсутствует на выходе.

Я делаю что-то неправильно или что мне делать, чтобы заставить эту функцию работать так, как я хочу?

<?php 

    $Inventory1 = "111,222,333,111"; 
    $SplitInventory1 = explode(",",$Inventory1); 

    $Invoice = "111,222"; 
    $SplitInvoice = explode(",",$Invoice); 


    $SplitResult1 = array_diff($SplitInventory1, $SplitInvoice);  
    echo $JointInventory1 = implode(",",$SplitResult1); 

?> 
+2

'array_diff()' (То же самое для подобных функций) не учитывает количество одинаковых элементов. Поэтому, если в массиве теперь есть 1x'111' или 10x'111', не имеет значения, он просто будет один раз на выходе, или нет. Поэтому для того, что вы хотите, вы хотите написать свою собственную функцию, используя простой цикл foreach, чтобы отменить каждый элемент из одного массива в другом. – Rizier123

+0

* "' array_diff' возвращает значения в массиве1, которые не присутствуют ни в одном из других массивов. «* -' 111' существует в другом массиве, зачем его нужно возвращать? – deceze

ответ

1

HI я использовал array_filter для фильтрации значений $SplitInventory1 массива с помощью $SplitInvoice. Если array_filter'scallback function return true, то текущая стоимость будет помещена в новый array.

так stpes будет

1) $var будет нести значения первого массива, как и с помощью 111,222,333,444array_search она будет проверять они существуют или нет в $SplitInvoice массиве.

2) array_search вернуть key найденного значения так, когда 111 и 222, найденного в $SplitInvoice массива, то функция обратного вызова будет возвращать ложь, и эти значения не будут размещать в $diff но когда 333 производится поиск в $SplitInvoice. это не будет найдено в $SplitInvoice, и функция обратного вызова вернет true и будет помещена в $diff.

3) Еще одна вещь, которую я unset$SplitInvoice массив, если значение найдено beacuse нам нужно Продублируйте записи (из-за 111, если $ SplitInvoice не снята с охраны, то она не придет в $diff)

<?php 
    $Inventory1 = "111,222,333,111"; 
    $SplitInventory1 = explode(",",$Inventory1); 
    $Invoice = "111,222"; 
    $SplitInvoice = explode(",",$Invoice); 
    $diff = array_filter($SplitInventory1, 
    function ($val) use (&$SplitInvoice) { 
    $key = array_search($val,$SplitInvoice); 
    if ($key === false) return true; 
    unset($SplitInvoice[$key]); 
    return false; 
    } 
); 

echo "<pre>";print_r($diff); 

?> 

Выход

Array 
(
    [2] => 333 
    [3] => 111 
) 
+2

привет, сэр, можете ли вы прокомментировать свои коды? спасибо –

+1

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения , Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! – Rizier123

+0

... это привлекает хорошую карму ;-) –

Смежные вопросы