2015-04-09 4 views
2

я два JSON закодированные массивы первого массива {
"User_id":2, "Seeds":["11","22","31","14"] }
Сортировка JSON закодированный массив, основанный на другом

второй массив

{ 
"Seeds": [ 
    { 
     "Team_name": "Belmont Bruins", 
     "Team_id": "22", 

    }, 
    { 
     "Team_name": "Arkansas State Red Wolves", 
     "Team_id": "14", 
    }, 
    { 
     "Team_name": "Arizona Wildcats", 
     "Team_id": "11", 
    }, 
    { 
     "Team_name": "Brown Bears", 
     "Team_id": "31", 
    } 
] 

}

Теперь мне нужно отсортировать 2-й массив на основе 1-го массива. «Семена» в первом массиве соответствуют «Team_id» во втором массиве. Выход требуется:

{ 
    "Seeds": [ 
     { 
      "Team_name": "Arizona Wildcats", 
      "Team_id": "11", 

     }, 
     { 
      "Team_name": "Belmont Bruins", 
      "Team_id": "22", 
     }, 
     { 
      "Team_name": "Brown Bears", 
      "Team_id": "31", 
     }, 
     { 
      "Team_name": "Arkansas State Red Wolves", 
      "Team_id": "14", 
     } 
    ] 
} 

Я нашел подобные вопросы. Но решения, похоже, не работают в этом случае.

+0

Как вы формируете эти два массива? Можете ли вы также разместить код PHP? – Butterfly

+0

Можете ли вы вставить свой код? –

+0

JSON не имеет значения, вы просто декодируете JSON в массивы и затем кодируете его обратно; вы не можете сортировать «JSON», потому что это просто строка. Выбрав это из уравнения, просмотрите http://stackoverflow.com/a/17364128/476 и попробуйте методы, описанные там. – deceze

ответ

1

Вы можете использовать следующий пример. Я создаю поиск с использованием array_flip() и сортирую второй массив на основе этого.

Имея это: JSON

$j1 = <<<EOF 
{ 
    "User_id":2, 
    "Seeds":["11","22","31","14"] 
} 
EOF; 

// I needed to remove addtional commas here 
$j2 = <<<EOF 
{ 
"Seeds": [ 
    { 
     "Team_name": "Belmont Bruins", 
     "Team_id": "22" 

    }, 
    { 
     "Team_name": "Arkansas State Red Wolves", 
     "Team_id": "14" 
    }, 
    { 
     "Team_name": "Arizona Wildcats", 
     "Team_id": "11" 
    }, 
    { 
     "Team_name": "Brown Bears", 
     "Team_id": "31" 
    } 
] 
} 
EOF; 

... Вы можете сделать следующее:

// Convert to array 
$a1 = json_decode($j1, true); 
$a2 = json_decode($j2, true); 

// Create lookup 
$lookup = array_flip($a1["Seeds"]); 

// sort array2 
usort($a2["Seeds"], function($a, $b) use($lookup) { 
    if($lookup[$a["Team_id"]] > $lookup[$b["Team_id"]]) { 
     return 1; 
    } else if ($lookup[$a["Team_id"]] < $lookup[$b["Team_id"]]) { 
     return -1; 
    } 
    return 0; 
}); 

// Done 
var_dump($a2); 
+0

Я получаю Неустранимая ошибка: Невозможно использовать объект типа stdClass в качестве массива в ... – 73ey

+0

Затем вы сделали ошибку с копированием. См. Действующий код: http://3v4l.org/YU8hN. Он работает для всех версий PHP 5.3.0. Обратите внимание, что я передаю 'true' как второй аргумент' json_decode() '. – hek2mgl

+0

Извините, приятель ... Мой плохой .. Tkz для быстрого ответа ... – 73ey

1

Вы должны декодировать формат JSON, сортировки массива, а затем кодировать в формат JSON:

$array1 = json_decode($array1_json); 
$array2 = json_decode($array2_json);  
foreach ($array1['Seeds'] as $order) 
    { 
     foreach ($array2['Seeds'] as $data) 
     { 
      if ($data['Team_id'] == $order) 
       $array_sorted[] = $data; 
     } 
    } 
    $array2_sorted = array('Seeds' => $array_sorted); 
    echo json_encode($array2_sorted); 
+0

Я получаю Неустранимая ошибка: Невозможно использовать объект типа stdClass как массив в – 73ey

1
<?php 

    $sort_by = [11, 22, 31, 14]; 
    $to_sort = [ 
      array(
       "Team_name" => "Belmont Bruins", 
       "Team_id"=> 22, 
      ), 
      array(
       "Team_name" => "Arkansas State Red Wolves", 
       "Team_id" => 14, 
      ), 
      array(
       "Team_name" => "Arizona Wildcats", 
       "Team_id" => 11, 
      ), 
      array(
        "Team_name" => "Brown Bears", 
        "Team_id" => 31, 
      ) 
    ]; 

    $hash = []; 

    foreach ($to_sort as $value){ 
      $hash[$value["Team_id"]] = $value; 
    } 

    $len = count($sort_by); 
    $sorted = []; 

    for ($i=0; $i<$len; $i++) 
      $sorted[] = $hash[$sort_by[$i]]; 

    var_dump($sorted); 
?> 
0

Вы можете сделать что-то вроде этого :)

$a1 = json_decode('{ 
    "User_id":2, 
    "Seeds":["11","22","31","14"] 
}', true); 

$a2 = json_decode('{"Seeds": [ 
    { 
     "Team_name": "Belmont Bruins", 
     "Team_id": "22" 
    }, 
    { 
     "Team_name": "Arkansas State Red Wolves", 
     "Team_id": "14" 
    }, 
    { 
     "Team_name": "Arizona Wildcats", 
     "Team_id": "11" 
    }, 
    { 
     "Team_name": "Brown Bears", 
     "Team_id": "31" 
    }]}', true);  

$hash = array(); 
$out = array(); 
foreach ($a2['Seeds'] as $props) $hash[$props['Team_id']] = $props; 
foreach ($a1['Seeds'] as $id) $out[] = $hash[$id]; 
die(json_encode($out)); 
Смежные вопросы