Forum Webscript.Ru

Программирование => PHP => Тема начата: RelaX от 16 Марта 2002, 18:48:35

Название: из "большего" массива вычесть "меньший массив"
Отправлено: RelaX от 16 Марта 2002, 18:48:35
есть первый массив
$coin = array (\'1\', \'4\', \'9\', \'34\', \'26\');
и второй $money = array (\'3\', \'5\', \'56\', \'1\', \'37\', \'9\');
мне надо удалить из второго массива все совпадающие элементы с первым массивом, т.е. третий массив должен иметь вид
$massiv = array (\'3\', \'5\', \'56\', \'37\');
как такое сделать?
Название: из "большего" массива вычесть "меньший массив"
Отправлено: AlieN от 16 Марта 2002, 19:02:46
Вроде так:
$new_array=array($array1,$array2);
$new_array2=array_unique($new_array);
Название: из "большего" массива вычесть "меньший массив"
Отправлено: RelaX от 16 Марта 2002, 19:49:28
AlieN
нет, это не подойдет, т.к. array_unique($new_array); удаляет повторяющие элементы в новом массиве (например массив содержит \'2\', \'4\', \'2\', \'2\', \'9\' , то после этой функции массив станет \'2\', \'4\' ), мне надо полное исключение эелементов первого массива во втором....
Название: из "большего" массива вычесть "меньший массив"
Отправлено: AlieN от 17 Марта 2002, 12:59:35
тогда array_walk + array_search
Название: из "большего" массива вычесть "меньший массив"
Отправлено: RelaX от 17 Марта 2002, 13:44:25
сделал то, что мне надо:

$b=mysql(DBName,"select * from $table1");
for($i=0; $i { $cat=mysql_fetch_array($b);
$array_catid[]=$cat[catid];
 };


 $d=mysql(DBName,"select * from $table2");
for($i=0; $i { $tovar=mysql_fetch_array($d);
$array_tovar[]=$tovar[category];
};

$new_array = array_merge($array_catid, $array_tovar);
$new_array = array_unique($new_array);


foreach ($array_catid as $key=>$value)
      {
       foreach ($new_array as $keys=>$values)
             {
              if ($array_catid[$key]===$new_array[$keys])
                   {
                   unset ($new_array[$keys]);

                   };

             };

      };


код может выглидит и ужасно, но как ни странно, это РАБОТАЕТ :)
Название: из "большего" массива вычесть "меньший массив"
Отправлено: AlieN от 20 Марта 2002, 21:29:41

foreach ($array_catid as $key=>$value)
{
if($unsetkey=array_search ($array_catid[$key],$new_array))
    {
     unset($new_array[$unsetkey]);
    }
}

Код не проверял но вот какой алгоритм только что из спецификации прочитал:
array_search возвращает ключ элемента массива в котором найдено совпадение
следовательно ты проходишься под олному массиву и делаешь поиск по другому такого же значения в случае успеха ты получаешь ключ элемента во массиве в котором ты делаешь поиск.
Если код не работае так как сверху то должен работать вот так:

foreach ($array_catid as $key=>$value)
{
if(array_search ($array_catid[$key],$new_array))
    {
     $unsetkey=array_search ($array_catid[$key],$new_array);
     unset($new_array[$unsetkey]);
    }
}
Название: из "большего" массива вычесть "меньший массив"
Отправлено: Артем от 22 Марта 2002, 11:59:10
Зачем мучиться?

$k = 0;
for ($i = 0; $i < sizeof($money); $i++) {
      if (!in_array($money[$i], $coin)) {
            $massiv[$k] = $money[$i];
            $k++;
      }
}
Название: из "большего" массива вычесть "меньший массив"
Отправлено: AlieN от 22 Марта 2002, 14:01:44
Артем
Я сначала так и думал но вот это фразу в спецификации не понял:
Цитировать

in_array (mixed needle, array haystack [, bool strict])

Поэтому переписал через array_search
Название: из "большего" массива вычесть "меньший массив"
Отправлено: Dm от 22 Марта 2002, 21:44:33
с слабо еще проще решение? ;)

$arr3 = array_diff($arr2, $arr1);