2017-05-16 63 views
0

在PHP 7,如果我有這樣的數組:添加順序列於多維數組

$array = [ 
    ["name" => "Jon", "age" => 44], 
    ["name" => "Bob", "age" => 32], 
    ["name" => "Jim", "age" => 103], 
    ["name" => "Ted", "age" => 19] 
]; 

什麼是處理這個數組中添加一個額外的列表明誰是最舊到誰是最優雅的方式是最年輕的......

[ 
    ["name" => "Jon", "age" => 44, "order" => 2], 
    ["name" => "Bob", "age" => 32, "order" => 3], 
    ["name" => "Jim", "age" => 103, "order" => 1], 
    ["name" => "Ted", "age" => 19, "order" => 4] 
] 

回答

0

如果沒有一個參考點來確定哪一個是最老的用戶,您可能會進行多循環比較或排序然後插入。

的多環comparasin看起來像

<?php 
$array = [ 
    ["name" => "Jon", "age" => 44], 
    ["name" => "Bob", "age" => 32], 
    ["name" => "Jim", "age" => 103], 
    ["name" => "Ted", "age" => 19] 
]; 

$count = count($array); 

for($index = 0; $index < $count; ++$index) { 
    $order = 1; 
    $age = $array[$index]["age"]; 
    for($index2 = 0; $index2 < $count; ++$index2) { 
    if($array[$index2]["age"] > $age) { 
     ++$order; 
    } 
    } 

    $array[$index]["order"] = $order; 
} 

echo "<pre>"; 
var_dump($array); 
echo "</pre>"; 

排序,然後插入將涉及array_walkuasort

docs

<?php 
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple"); 

function test_alter(&$item1, $key, $prefix) 
{ 
    $item1 = "$prefix: $item1"; 
} 

function test_print($item2, $key) 
{ 
    echo "$key. $item2<br />\n"; 
} 

echo "Before ...:\n"; 
array_walk($fruits, 'test_print'); 

array_walk($fruits, 'test_alter', 'fruit'); 
echo "... and after:\n"; 

array_walk($fruits, 'test_print'); 

docs

<?php 
// Comparison function 
function cmp($a, $b) { 
    if ($a == $b) { 
    return 0; 
    } 
    return ($a < $b) ? -1 : 1; 
} 

// Array to be sorted 
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4); 
print_r($array); 

// Sort and print the resulting array 
uasort($array, 'cmp'); 
print_r($array); 

所以你的例子會是這樣的:

<?php 
function walkFunc(&$item, $key) { 
    $item["order"] = $key + 1; 
} 

// as @waterloomatt mentioned the Spaceship operator is meant for this 
function sortComp($a, $b) { 
    return ($a["age"] <=> $b["age"]) * -1; 
} 

$array = [ 
    ["name" => "Jon", "age" => 44], 
    ["name" => "Bob", "age" => 32], 
    ["name" => "Jim", "age" => 103], 
    ["name" => "Ted", "age" => 19] 
]; 

uasort($array, 'sortComp'); 
array_walk($array, 'walkFunc'); 

echo "<pre>"; 
var_dump($array); 
echo "</pre>"; 
1

這裏我們使用多個函數來獲得所需的輸出。 array_column提取列age中,我們反向排序使用列arsort($columns);然後gettingarray_values,那麼我們就翻轉陣列來獲得它的使用array_flip年齡順序,最後我們使用array_maparray_merge迭代以及陣列中增加一列。

Try this code snippet here

<?php 
ini_set('display_errors', 1); 
$array = [ 
    ["name" => "Jon", "age" => 44], 
    ["name" => "Bob", "age" => 32], 
    ["name" => "Jim", "age" => 103], 
    ["name" => "Ted", "age" => 19] 
]; 
$columns= array_column($array, "age");//obtaining column age 
arsort($columns);//sorting column in reverse 

$column=array_flip(array_values($columns));//getting order for age 
$result=array_map(function($value) use(&$column){ 
    $value= array_merge($value,array("order"=>$column[$value["age"]]+1));//adding age column to array by adding index with 1 
    return $value; 

}, $array); 
print_r($result); 

輸出:

Array 
(
    [0] => Array 
     (
      [name] => Jon 
      [age] => 44 
      [order] => 2 
     ) 

    [1] => Array 
     (
      [name] => Bob 
      [age] => 32 
      [order] => 3 
     ) 

    [2] => Array 
     (
      [name] => Jim 
      [age] => 103 
      [order] => 1 
     ) 

    [3] => Array 
     (
      [name] => Ted 
      [age] => 19 
      [order] => 4 
     ) 

) 
1

不會說謊,我只是想使用新的飛船運營商。這不會添加新列,而是會按年齡降序排列數組。

<?php 

$array = [ 
    ["name" => "Jon", "age" => 44], 
    ["name" => "Bob", "age" => 32], 
    ["name" => "Jim", "age" => 103], 
    ["name" => "Ted", "age" => 19] 
]; 

usort($array, function ($a, $b) { 
    return ($a["age"] <=> $b["age"]) * -1; 
}); 

print_r($array);