fork download
  1. <?php
  2. /**
  3.  * К вопросу http://h...content-available-to-author-only...e.ru/questions/335487
  4.  */
  5.  
  6. //Старый массив
  7. $array1 = array(
  8. array('name' => 'admin1','money' => '1'),
  9. array('name' => 'admin2','money' => '2'),
  10. array('name' => 'admin3','money' => '3'),
  11. array('name' => 'admin4','money' => '4'),
  12. array('name' => 'admin5','money' => '5')
  13. );
  14.  
  15. //Новый массив
  16. $array2 = array(
  17. array('name' => 'admin11','money' => '6'),
  18. array('name' => 'admin2','money' => '7'),
  19. array('name' => 'admin3','money' => '8'),
  20. array('name' => 'admin7','money' => '9'),
  21. array('name' => 'admin1','money' => '2')
  22. );
  23.  
  24. // можно не сортировать, если известно, что имена идут по возрастанию
  25. usort( $array1, "byName");
  26. usort( $array2, "byName");
  27.  
  28. // перемотать указатель на первые элементы
  29. reset( $array1);
  30. reset( $array2);
  31.  
  32. $result = array();
  33. $a = current( $array1);
  34. $b = current( $array2);
  35. while( TRUE) {
  36. $sign = min(1, max(-1, strcmp( $a['name'], $b['name']))); // -1, 0 или 1
  37. switch( $sign) {
  38. case 0:
  39. if( $a['money'] != $b['money'] ) {
  40. $a['money'] += $b['money'];
  41. }
  42. array_push( $result, $a);
  43. $a = next( $array1);
  44. $b = next( $array2);
  45. break;
  46. case 1:
  47. array_push( $result, $b);
  48. $b = next( $array2);
  49. break;
  50. case -1:
  51. array_push( $result, $a);
  52. $a = next( $array1);
  53. }
  54.  
  55. // не подошли ли к концу?
  56. if( $a === FALSE) {
  57. rest_of( $array1, $result);
  58. break;
  59. }
  60. if( $b === FALSE) {
  61. rest_of( $array1, $result);
  62. break;
  63. }
  64. }
  65.  
  66. // вывод результата
  67. foreach( $result AS $a) printf( "%s: €%s\n", $a['name'], $a['money']);
  68.  
  69.  
  70. function byName( $a, $b) { // сортировка по полю name
  71. return strcmp( $a['name'], $b['name']);
  72. }
  73.  
  74. function rest_of( &$arr, &$result){ // дописать остаток массива в $result
  75. while( ($a = next( $arr)) !== FALSE) {
  76. array_push( $result, $a);
  77. }
  78. }
Success #stdin #stdout 0.01s 20520KB
stdin
Standard input is empty
stdout
admin1: €3
admin11: €6
admin2: €9
admin3: €11
admin4: €4
admin5: €5