2016-11-14 8 views
0

I ein mehrdimensionales Array, die aus einer JSON API ist:Reorder mehrdimensionales Array von Liste von IDs

{ 
    "status": "success", 
    "data": [ 
     { 
      "id": 7, 
      "anchor": "Atkins Diet Coupon", 
      "status": "viewed", 
      "points": 0, 
      "latest_date": 1432135046, 
      "created_date": 1432134221, 
      "contacted": true 
     }, 
     { 
      "id": 6, 
      "anchor": "Videostripe", 
      "status": "viewed", 
      "points": 0, 
      "latest_date": 1432134545, 
      "created_date": 1432131231, 
      "contacted": false 
     }, 
     { 
      "id": 1, 
      "anchor": "Smilebox", 
      "status": "viewed", 
      "points": 0, 
      "latest_date": 1432053140, 
      "created_date": 1432131131, 
      "contacted": false 
     } 
    ] 
} 

I umwandeln es den folgenden PHP Code verwendet:

$data = file_get_contents($api_url); 
$data = json_decode($data, true); 

Ich habe eine Liste von ids, die ich zum ersten Mal in dem mehrdimensionalen Array haben will angezeigt:

$ids = array('1','6'); 

So in diesem Beispiel: die multidimensiona l Array würde mit 1,6,7 basierend auf der Reihenfolge des IDs-Arrays neu angeordnet und dann wieder in seine ursprüngliche Reihenfolge zurückversetzt, wenn es nicht im Array IDs enthalten ist.

Dies ist eine sehr komplizierte Sache und ich bin mir nicht sicher, wie es geht!

+0

So zu helfen, im Grunde wollen Sie nur 1 und 6 erste und der Rest später richtig? – prateekkathal

+0

yep, aber neuordnung so alle Daten folgt mit den IDs - anstatt nur die IDs –

+0

Ich antwortete unten ... Lassen Sie mich wissen, wenn etwas anderes erforderlich ist :) – prateekkathal

Antwort

1

Sie können usort verwenden, um Ihre eigenen Sortierregeln festzulegen.

Zum Beispiel:

$ids = array('1','6'); 
usort($data["data"], function ($a, $b) use ($ids) { 
    $pos_a = array_search($a['id'], $ids); 
    $pos_b = array_search($b['id'], $ids); 
    if ($pos_a === FALSE && $pos_b === FALSE) { 
     return $a['id'] - $b['id']; 
    } 
    if ($pos_a === FALSE) { 
     return 1; 
    } 
    if ($pos_b === FALSE) { 
     return -1; 
    } 
    return $pos_a - $pos_b; 
}); 
var_dump($data); 
0

Sie ein weiteres Array mit ersten Werten aus dem ID-Array erstellen und dann anderen Elementen. Sie können eine benutzerdefinierte Funktion erstellen, um den Schlüssel des Elements aus dem Array abzurufen, das dem Wert der ID zugeordnet ist. Der folgende Code kann Ihnen helfen. Dies ist nicht für (1,6) festgelegt. Dies ist eine allgemeine Lösung. Sie können jede Bestellung, jede Anzahl von Elementen eingeben.

<?php 
$data = '{ 
"status": "success", 
"data": [ 
    { 
     "id": 7, 
     "anchor": "Atkins Diet Coupon", 
     "status": "viewed", 
     "points": 0, 
     "latest_date": 1432135046, 
     "created_date": 1432134221, 
     "contacted": true 
    }, 
    { 
     "id": 6, 
     "anchor": "Videostripe", 
     "status": "viewed", 
     "points": 0, 
     "latest_date": 1432134545, 
     "created_date": 1432131231, 
     "contacted": false 
    }, 
    { 
     "id": 1, 
     "anchor": "Smilebox", 
     "status": "viewed", 
     "points": 0, 
     "latest_date": 1432053140, 
     "created_date": 1432131131, 
     "contacted": false 
    } 
] 
}'; 

zu Array konvertieren, ids-Array erstellen, initialisieren einen Neuordnungs Array

$data = json_decode($data, true); 
$ids= array(1,6); 
$array_elements = $data['data']; 
$reordered_array=array(); 

Verwenden foreach die neu geordneten Array mit dem IDs aus der array.Use benutzerdefinierten Funktion zu füllen, um das Element zu finden. Entfernen Sie die verschobenen Elemente aus dem Array. dann füge sie zusammen.

foreach($ids as $id) 
{ 
    $get_key = mycustfunction($array_elements,'id',$id); 
    $reordered_array[] = $array_elements[$get_key]; 
    unset($array_elements[$get_key]); 
} 
$result_array = array_merge($reordered_array,$array_elements); 
print_r($result_array); 

Benutzerdefinierte Funktion

function mycustfunction($products, $field, $value) 
{ 
    foreach($products as $key => $product) 
    { 
    if ($product[$field] === $value) 
    return $key; 
    } 
    return false; 
} 
0
$result = []; 

// Convert the values into keys for convenience. 
// It is easy to check if ID exists with isset($keys[$id]). 
$keys = array_flip($ids); 

// Collect items $ids 
foreach ($ids as $id) { 
    // Search for an item with this ID 
    foreach ($data['data'] as $item) { 
    if ($item['id'] == $id) { 
     $result []= $item; 
     break; 
    } 
    } 
} 

// Collect the rest of the items 
foreach ($data['data'] as $item) { 
    if (!isset($keys[$item['id']])) 
    $result []= $item; 
} 
0

Sie können die Daten zu den IDs zuordnen. Dann Schleife über $ids und schnappen Sie sich die entsprechenden Daten in der Reihenfolge der ID-Darstellung im Array, auch unset funded $data Elemente. Fügen Sie dann die Elemente, die in der $data übrig sind, an das Ende des Arrays an, das fundierte Elemente enthält.

$data = array_combine(
    array_column($response['data'], 'id'), 
    $response['data'] 
); 

$keyed = array_map(function ($id) use (&$data) { 
    if (isset($data[$id])) { 
     $datum = $data[$id]; 
     unset($data[$id]); 

     return $datum; 
    } 

    return null; 
}, $ids); 

$data = array_values($keyed + $data); 

Hier ist demo.

Beachten Sie, dass, wenn kein Element mit idnull Werte gegeben ist.

1

Das glaube ich ist ein sauberer Code :)

$ids = [1,6]; 

sort($ids); // Optional (For cases where you mistakenly write [1,7,6]) 

usort($data, function($a, $b) { 
    return $a['id'] > $b['id']; 
}); 

$ordered = array_filter($data, function($arrayData) use ($ids) { 
    return (in_array($arrayData['id'], $ids)); 
}); 

$unordered = array_filter($data, function($arrayData) use ($ids) { 
    return (!in_array($arrayData['id'], $ids)); 
}); 

$finalArray = array_merge($ordered, $unordered); 

Glad :)

+0

Ich mag das mehr als meine Antwort. Besser lesbar. – fafl

+0

Zuerst müssen Sie die Schließung für $ ids wie diese Funktion ($ arrayData) verwenden ($ ids). Zweitens, Ihre Lösung ** speichert nicht die Elemente **. Es setzt einfach Elemente, deren "id" sich zuerst im Array $ ids befindet, ohne die Reihenfolge zu beachten. – sevavietl

+0

@sevavietl Erstens, ja, ich weiß, ich schrieb eigentlich eine neue Seite in meiner ATOM-IDE, also vergaß ich den 'use ($ ids)' -Teil beim Schreiben .... Zweitens, das wird nie die Reihenfolge ignorieren. .. array_filter ist dazu bestimmt, die nicht benötigten ID-Felder aus der $ data-Tabelle aus ihren jeweiligen Positionen herauszunehmen/zu entfernen und array_merge setzt einfach die bestellte vor einer ungeordneten ... Und das ist, was ich glaube, nach dem Fragebogen gefragt. . (wie in den Fragekommentaren besprochen) – prateekkathal

Verwandte Themen