2016-07-01 2 views
0

У меня есть ассоциативный массив как этогоСнимите соответствующий элемент в массиве

$arrz1=Array([sss] => Array 
    (
     [0] => 315 
     [1] => 330 
     [2] => 345 
     [3] => 315 
     [4] => 330 
     [5] => 345 
     [6] => 360 
     [7] => 315 
     [8] => 330 
     [9] => 345 
     [10] => 360 
     [11] => 375 
    ) 

[fff] => Array 
    (
     [0] => 315 
     [1] => 330 
     [2] => 345 
     [3] => 315 
     [4] => 330 
     [5] => 345 
     [6] => 360 
     [7] => 315 
     [8] => 330 
     [9] => 345 
     [10] => 360 
     [11] => 375 
     [12] => 750 
     [13] => 765 
     [14] => 780 
    ) 

)

Я хочу, чтобы достичь this.Provided размера массива может изменяться и каждый следующий не должен иметь предыдущий весь элемент:

Array([0] => Array 
    (
     [0] => Array 
      (
       [0] => 315 
       [1] => 330 
       [2] => 345 
       [3] => 315 
       [4] => 330 
       [5] => 345 
       [6] => 360 
       [7] => 315 
       [8] => 330 
       [9] => 345 
       [10] => 360 
       [11] => 375 
      ) 

    ) 

[1] => Array 
    (
     [0] => Array 
      (
       [0] => 750 
       [1] => 765 
       [2] => 780 
      ) 

    ) 

Нужно найти оптимальное решение с наименьшей временной сложностью. Так что результат получается достаточно быстро, чтобы достичь результата в соответствующем крайнем сроке. Так что я пробовал следующее

$array_key = array(); 
    $array_val = array(); 
    $mult = array(); 


    foreach ($arrz1 as $key => $val) { 

      $diff = array(); 
      foreach($val as $val1) 
      { 
       if(!in_array($val1, $array_val)) 
       { 

        $diff[] = $val1; 
       } 
      } 
     if(!in_array($key, $array_key)) 
     { 
      $array_key[] = $key; 

      //print_r($diff); 
      if(!empty($diff)) 
      { 
       $mult[] = array($diff); 
       foreach($val as $value) 
       { 
         $array_val[] = $value; 

       } 
      } 
      else 
      { 
       $mult[] = array($val); 
       foreach($val as $value) 
       { 

         $array_val[] = $value; 
       } 
      } 
     } 
    } 

Результат является правильным, но время слишком много

+2

А что вы пробовали до сих пор – RiggsFolly

+1

@RiggsFolly я добавил код – Lucky

+0

Используйте 'array_diff () 'или' array_diff_assoc() 'в зависимости от ваших требований. – jeroen

ответ

3

Рассмотрим следующий подход с использованием array_diff и array_values функции:

// $arr is your initial array 
$items = array_values($arr); 

foreach ($items as $k => &$item) { 
    if ($k != 0) $item = array_values(array_diff($item, $items[$k-1])); 
} 

print_r($items); 

Выход:

Array 
(
    [0] => Array 
     (
      [0] => 315 
      [1] => 330 
      [2] => 345 
      [3] => 315 
      [4] => 330 
      [5] => 345 
      [6] => 360 
      [7] => 315 
      [8] => 330 
      [9] => 345 
      [10] => 360 
      [11] => 375 
     ) 

    [1] => Array 
     (
      [0] => 750 
      [1] => 765 
      [2] => 780 
     ) 
) 
+0

Это решение работает, но мне нужен индексированный массив, а $ items [1] индексируется с 12 по 14 с 1 по 4. – Lucky

+0

Посмотрите второй фрагмент кода вопроса. Раздел 2, определяющий, чего я хочу достичь. Чтобы достичь элемент i должен: $ arr [0] [0] [0], но, скорее, у вас есть $ items [0] [0]. Получите разницу – Lucky

+0

@ Lucky, я рад, что вы смогли поместиться мое решение ваших окончательных потребностей. Благодарю. Но я не вижу преимущества добавления дополнительного уровня вложенных массивов, как показано в ожидаемом примере. – RomanPerekhrest

0

Так быстрее всего было бы использовать array_diff. Вы можете сохранить текущее состояние, которое содержит уже проиндексированные элементы, и продолжить сравнение нового массива с состоянием.

Это будет работать, быстро и легко понять.

<?php 

$arr = 
[ 
    'sss' => [315, 330, 345, 125], 
    'fff' => [315, 330, 345, 125, 750, 756, 780], 
    'eee' => [330, 345, 220, 750] 
]; 

$state = []; 

foreach($arr as $key => $item) 
{ 
    $arr[$key] = array_diff($item, $state); 
    $state += $arr[$key]; 
} 

var_dump($arr); 

Который приведет:

array(3) { 
    'sss' => 
    array(4) { 
    [0] => 
    int(315) 
    [1] => 
    int(330) 
    [2] => 
    int(345) 
    [3] => 
    int(125) 
    } 
    'fff' => 
    array(3) { 
    [4] => 
    int(750) 
    [5] => 
    int(756) 
    [6] => 
    int(780) 
    } 
    'eee' => 
    array(1) { 
    [2] => 
    int(220) 
    } 
} 

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

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