2017-02-14 43 views
1

我有這樣的代碼:如何取消設置包含唯一值的數組?

<?php 
$input = [ 
    ["From"=>"Jack", "To"=>"Peter"], 
    ["From"=>"Jack", "To"=>"John"], 
    ["From"=>"Jack", "To"=>"Ali"], 
    ["From"=>"Ali", "To"=>"Jack"], 
    ["From"=>"Ali", "To"=>"Martin"], 
    ["From"=>"Jack", "To"=>"Barmar"], 
    ["From"=>"Peter", "To"=>"John"] 
]; 
$output = []; 

array_walk($input, function($element) use (&$output) { 
    $output[$element['From']][] = $element; 
}); 

print_r(array_values($output)); 

/* 
Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [From] => Jack 
        [To] => Peter 
       ) 

      [1] => Array 
       (
        [From] => Jack 
        [To] => John 
       ) 

      [2] => Array 
       (
        [From] => Jack 
        [To] => Ali 
       ) 

      [3] => Array 
       (
        [From] => Jack 
        [To] => Barmar 
       ) 

     ) 

    [1] => Array 
     (
      [0] => Array 
       (
        [From] => Ali 
        [To] => Jack 
       ) 

      [1] => Array 
       (
        [From] => Ali 
        [To] => Martin 
       ) 

     ) 

    [2] => Array 
     (
      [0] => Array 
       (
        [From] => Peter 
        [To] => John 
       ) 

     ) 

) 

現在我想刪除整個數組時To關鍵的valye是唯一(不存在既不FromTo鍵的值)。因此,這是預期的結果:barmarmartin和獨特的,所以他們的陣列應該被刪除)

/* 
Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [From] => Jack 
        [To] => Peter 
       ) 

      [1] => Array 
       (
        [From] => Jack 
        [To] => John 
       ) 

      [2] => Array 
       (
        [From] => Jack 
        [To] => Ali 
       ) 
     ) 

    [1] => Array 
     (
      [0] => Array 
       (
        [From] => Ali 
        [To] => Jack 
       ) 
     ) 

    [2] => Array 
     (
      [0] => Array 
       (
        [From] => Peter 
        [To] => John 
       ) 

     ) 

) 

我怎麼能這樣做?

+0

我就開始array_walk – RST

+0

之前執行的唯一性檢查@RST你的意思是什麼? – stack

回答

0

將單個數組中的所有值都推入,然後對其元素進行計數。如果count> 1,那麼只需要輸入值即可。試試這個:

$input = [ 
    ["From"=>"Jack", "To"=>"Peter"], 
    ["From"=>"Jack", "To"=>"John"], 
    ["From"=>"Jack", "To"=>"Ali"], 
    ["From"=>"Ali", "To"=>"Jack"], 
    ["From"=>"Ali", "To"=>"Martin"], 
    ["From"=>"Jack", "To"=>"Barmar"], 
    ["From"=>"Peter", "To"=>"John"] 
]; 

$exist_array=array(); 
foreach ($input as $key => $value) { 
    foreach ($value as $key1 => $value1) {   
     array_push($exist_array, $value1); 
    } 
} 

$vals = array_count_values($exist_array); 

$output = []; 
array_walk($input, function($element) use (&$output,$vals) { 
    if($vals[$element['To']] > 1) 
    $output[$element['From']][] = $element; 
}); 
echo "<pre>"; 
print_r(array_values($output)); 

檢查結果這裏:

https://eval.in/736562

0
<?php 

echo ('<pre>'); 

$input = [ 
    ["From"=>"Jack", "To"=>"Peter"], 
    ["From"=>"Jack", "To"=>"John"], 
    ["From"=>"Jack", "To"=>"Ali"], 
    ["From"=>"Ali", "To"=>"Jack"], 
    ["From"=>"Ali", "To"=>"Martin"], 
    ["From"=>"Jack", "To"=>"Barmar"], 
    ["From"=>"Peter", "To"=>"John"] 
]; 

$input = array_filter($input, function($from_to) use ($input) { 

    foreach ($input as $item) { 

     if ($item == $from_to) 
      continue; 

     if (in_array($from_to['To'], $item, true)) 
      return true; 
    } 

    return false; 
}); 

$output = []; 

array_walk($input, function($element) use (&$output) { 
    $output[$element['From']][] = $element; 
}); 

print_r(array_values($output)); 
0

計數次數爲每名,然後檢查$input名的值與計數1. $output陣列將你的開始點數爲array_walk

$input = [ 
    ["From"=>"Jack", "To"=>"Peter"], 
    ["From"=>"Jack", "To"=>"John"], 
    ["From"=>"Jack", "To"=>"Ali"], 
    ["From"=>"Ali", "To"=>"Jack"], 
    ["From"=>"Ali", "To"=>"Martin"], 
    ["From"=>"Jack", "To"=>"Barmar"], 
    ["From"=>"Peter", "To"=>"John"] 
]; 

$unique = array(); 
$output = array(); 

foreach ($input as $entrie => $row) { 
    foreach($row as $key => $value) { 

    if (! isset($unique[$value])) { 
     $unique[$value]= 1 ; 
    } else { 
     $unique[$value]++ ; 
    } 
    } 
}  

foreach ($input as $entrie => $row) { 
     if ($unique[$row['From']] != 1 && $unique[$row['To']] != 1) 
      $output[] = $row; 
} 

print_r($output); 
0

試試這個

<?php 

$input = [ 
    ["From"=>"Jack", "To"=>"Peter"], 
    ["From"=>"Jack", "To"=>"John"], 
    ["From"=>"Jack", "To"=>"Ali"], 
    ["From"=>"Ali", "To"=>"Jack"], 
    ["From"=>"Ali", "To"=>"Martin"], 
    ["From"=>"Jack", "To"=>"Barmar"], 
    ["From"=>"Peter", "To"=>"John"] 
]; 

$removeUnique = iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($input)),FALSE); 
$removeUnique = (array_unique(array_diff_assoc($removeUnique, array_unique($removeUnique)))); 

$output = []; 

array_walk($input, function($element) use (&$output,$removeUnique) { 

    if(in_array($element['From'], $removeUnique) && in_array($element['To'], $removeUnique)){ 
     $output[$element['From']][] = $element; 
    } 
}); 

echo "<pre>"; 
print_r(array_values($output)); 

參考鏈接:

https://eval.in/736619

0

@stack試試這個:

<?php 
    $input = [ 
     ["From"=>"Jack", "To"=>"Peter"], 
     ["From"=>"Jack", "To"=>"John"], 
     ["From"=>"Jack", "To"=>"Ali"], 
     ["From"=>"Ali", "To"=>"Jack"], 
     ["From"=>"Ali", "To"=>"Martin"], 
     ["From"=>"Jack", "To"=>"Barmar"], 
     ["From"=>"Peter", "To"=>"John"] 
    ]; 
    echo "<pre>"; 
    print_r($input); // array before 
    $to = []; 
    foreach($input as $key => $val){ 
     if(in_array($val["To"], $to)){ 
      unset($input[$key]); 
     }  
     $to[] = $val["To"]; 
    } 
    echo "<pre>"; 
    print_r(array_values($input));// array after 
相關問題