2017-02-11 35 views
1

我有這個數組:如何將一個數組縮小到多個小陣列?

$arr = [{"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"}]; 

現在我需要做基於From關鍵多個陣列。我的意思是,我需要將它們分開。就像這樣:

$arr1 = [{"From"=>"Jack", "To"=>"Peter"}, 
     {"From"=>"Jack", "To"=>"John"}, 
     {"From"=>"Jack", "To"=>"Ali"}, 
     {"From"=>"Jack", "To"=>"Barmar"}]; 

$arr2 = [{"From"=>"Ali", "To"=>"Jack"}, 
     {"From"=>"Ali", "To"=>"Martin"}]; 

$arr3 = [{"From"=>"Peter", "To"=>"John"}]; 

有人有任何想法我應該怎麼做?

+1

這是無效數組 – rahulsm

回答

3

您必須通過一些簡單的自己的邏輯實現來創建一個新的數組。看看這個簡單的例子:

<?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 
       ) 

     ) 

) 
+0

謝謝.. upvote .. *(開心新頭像b​​tw';-)')* – Shafizadeh

+0

@Shafizadeh哦,嗨,希望一切都好?曾經有一段時間...而頭像不是我的發明,我可恥地偷了它:-( – arkascha

+0

嗨,你也是哥們......是啊,好久不見了...... :-('..!無論如何,很高興見到你再過一段時間,thx在我的問題下寫一個答案,祝你一切順利,玩得開心':-)' – Shafizadeh

1

符號中的大括號應該是方括號。這裏是你能做什麼:

$arr = [["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"]]; 

$res = []; 
foreach ($arr as $row) { 
    if (!isset($res[$row['From']])) $res[$row['From']] = []; 
    $res[$row['From']][] = $row['To']; 
} 

print_r($res); 

$res將包含:

[ 
    "Jack" => ["Peter", "John", "Ali", "Barmar"], 
    "Ali" => ["Jack", "Martin"], 
    "Peter" => ["John"] 
] 

看到它在eval.in

2

數組的簡單重複和存儲元素導致陣列由From鍵解決您的需求:

$arr = [["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"]]; 

$result = array(); 
foreach ($arr as $item) { 
    $result[$item['From']][] = $item; 
} 

res ult:

array (size=3) 
    'Jack' => 
    array (size=4) 
     0 => 
     array (size=2) 
      'From' => string 'Jack' (length=4) 
      'To' => string 'Peter' (length=5) 
     1 => 
     array (size=2) 
      'From' => string 'Jack' (length=4) 
      'To' => string 'John' (length=4) 
     2 => 
     array (size=2) 
      'From' => string 'Jack' (length=4) 
      'To' => string 'Ali' (length=3) 
     3 => 
     array (size=2) 
      'From' => string 'Jack' (length=4) 
      'To' => string 'Barmar' (length=6) 
    'Ali' => 
    array (size=2) 
     0 => 
     array (size=2) 
      'From' => string 'Ali' (length=3) 
      'To' => string 'Jack' (length=4) 
     1 => 
     array (size=2) 
      'From' => string 'Ali' (length=3) 
      'To' => string 'Martin' (length=6) 
    'Peter' => 
    array (size=1) 
     0 => 
     array (size=2) 
      'From' => string 'Peter' (length=5) 
      'To' => string 'John' (length=4) 
-1

使用array_push()將值推入新數組。

+1

這不是問題的答案,它應該是一個評論。 – arkascha

1

這裏是你可能想確切的輸出,

<?php 
$arr = [ 
    ["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"], 
]; 
$from = ''; 
$temp = []; 
function array_orderby() 
{ 
    $args = func_get_args(); 
    $data = array_shift($args); 
    foreach ($args as $n => $field) { 
     if (is_string($field)) { 
      $tmp = array(); 
      foreach ($data as $key => $row) { 
       $tmp[$key] = $row[$field]; 
      } 

      $args[$n] = $tmp; 
     } 
    } 
    $args[] = &$data; 
    call_user_func_array('array_multisort', $args); 
    return array_pop($args); 
} 
function custom_function($arr) 
{ 
    $arr = array_orderby($arr, 'From', SORT_ASC); 
    foreach ($arr as $k => $v) { 
     if (empty($from) || $from != $v['From']) { 
      if (empty($from)) { 
       $i = 1; 
      } else { 
       $i++; 
      } 
      $from = $v['From']; 
     } 
     $temp['arr' . $i][] = $v; 
    } 
    return $temp; 
} 
$result = custom_function($arr); 

extract($result); 
print_r($arr1); 
print_r($arr2); 
print_r($arr3); 

工作link

試一試。

1
Hope this helps, 

$arr = [["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"] 
    ]; 

function getFrom($from, $arr) { 
    return array_filter($arr, function($k) use ($from){ 
     return $k["From"] == $from; 
    }); 
} 

$fromArray = getFrom('Jack', $arr); 
相關問題