2016-03-19 5 views
0

Ich habe ein Array wie auf diese WeiseTeilen Assocative Array in zwei gleiche Array mit Maximal- und minmum Werte in PHP

Array 
(
    [0] => Array 
     (
      [items] => 42 
      [prize] => 122 
     ) 

    [1] => Array 
     (
      [items] => 14 
      [prize] => 789 
     ) 

    [2] => Array 
     (
      [items] => 76 
      [prize] => 1228 
     ) 

    [3] => Array 
     (
      [items] => 23 
      [prize] => 122 
     ) 

    [4] => Array 
     (
      [items] => 15 
      [prize] => 567 
     ) 

) 

Daraus i zwei Arrays eine enthält die maximale Anzahl von items erstellen möchten und andere enthält Mindest Anzahl der Elemente

Erwarteter Ausgang

array1 (maximal)

[0] => Array 
     (
      [items] => 76 
      [prize] => 1228 
     ) 

    [1] => Array 
     (
      [items] => 42 
      [prize] => 122 
     ) 

    [2] => Array 
     (
      [items] => 23 
      [prize] => 122 
     ) 

Array 2 (minmal)

[0] => Array 
     (
      [items] => 15 
      [prize] => 567 
     ) 

    [1] => Array 
     (
      [items] => 23 
      [prize] => 122 
     ) 

n ist Länge ursprüngliche Array

if(n is odd) 

length firstarr=ceil(n/2); 

length secondarr =n- ceil(n/2) 

else 

length firstarr=secondarr=n/2 

wie kann ich die oben mit maximaler SplI und minimalen Wertebereich?

Antwort

1

Sie sollten damit beginnen, das Array nach der Anzahl der Elemente zu sortieren. Wir gehen mit aufsteigender Reihenfolge, aber es ist wirklich nicht so wichtig.

Es gibt ein paar verschiedene Möglichkeiten, dies zu erreichen. Sie könnten array_multisort verwenden, aber ich denke, usort mit einer anonymen Funktion ist ein bisschen kürzer und einfacher zu folgen.

Wenn Sie PHP 5.2 oder früher haben, müssen Sie den anonymen Funktionscode in eine benannte Funktion verschieben und so nennen. Wenn Sie Glück haben, PHP 7 zu haben, können Sie einfach return $a["items"] <=> $b["items"]; in der Funktion tun.

$array = [["items" => 42, "prize" => 122], ["items" => 14, "prize" => 789], 
      ["items" => 76, "prize" => 1228], ["items" => 23, "prize" => 122], 
      ["items" => 15, "prize" => 567]]; 
usort($array, function($a, $b) { 
    return $a["items"] < $b["items"] ? -1 : ($a["items"] > $b["items"] ? 1 : 0); }); 

Jetzt teilen Sie es in die höchsten und niedrigsten Werte. Nach array_splice bleibt die $array Variable übrig, die nur die Werte enthält, die nicht entfernt und in $lowest gespeichert wurden.

In Ihrem Beispiel waren die höchsten Werte in absteigender Reihenfolge, aber unsere sind in aufsteigender Reihenfolge. array_reverse wird dies beheben.

$lowest = array_splice($array, 0, floor(count($array)/2)); 
$highest = array_reverse($array); 

var_dump($highest); 
var_dump($lowest); 
1

Sie können usort() verwenden und die Werte an einen Callback-Pass zu vergleichen, bemerken die Verwendung des Verschlusses in den Rückruf,

<?php 

function sort_order($key, $order=1){ 
    if($order==1){ 
     return function ($a, $b) use ($key) { 
      return strcmp("$a[$key]","$b[$key]"); 
     };   
    } 
    else{ 
     return function ($a, $b) use ($key) { 
      return strcmp("$b[$key]","$a[$key]"); 
     }; 
    } 

} 

$minimal = array 
(
    0 => array 
     (
      'items' => 42, 
      'prize' => 122 
     ), 

    1 => array 
     (
      'items' => 14, 
      'prize' => 789 
     ), 

    2 => array 
     (
      'items' => 76, 
      'prize' => 1228 
     ), 

    3 => array 
     (
      'items' => 23, 
      'prize' => 122 
     ), 

    4 => array 
     (
      'items' => 15, 
      'prize' => 567 
     ) 


); 


$maximum = $minimal; 

usort($minimal, sort_order('items')); 
usort($maximum, sort_order('items',2)); 
print_r($minimal); 
print_r($maximum); 
?> 

Hier ist die Geige: https://eval.in/539270