csv_object_writer.class.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. /**
  3. * Write objects to a stream in csv format based on map.
  4. *
  5. * Usage
  6. *
  7. * $object->property_name_1 = 'name 1';
  8. * $object->property_name_2 = 'name 2';
  9. *
  10. * $map = array( 'property_name_1' => 'Header title 1',
  11. * 'property_name_2' => 'Header title 2');
  12. *
  13. * $writer = CsvObjectWriter::create($map, 'temp');
  14. * $writer->add($object);
  15. *
  16. * Output
  17. *
  18. * "Header title 1";"Header title 2"
  19. * "name 1";"name 2"
  20. *
  21. * @license /licence.txt
  22. * @author Laurent Opprecht <laurent@opprecht.info>
  23. */
  24. class CsvObjectWriter extends CsvWriter
  25. {
  26. /**
  27. *
  28. * @param string|object $stream
  29. * @return CsvWriter
  30. */
  31. static function create($stream, $map = '*', $delimiter = ';', $enclosure = '"')
  32. {
  33. return new self($stream, $map = '*', $map, $delimiter, $enclosure);
  34. }
  35. protected $map = '*';
  36. protected $headers_written = false;
  37. function __construct($stream, $map = '*', $delimiter = ';', $enclosure = '"')
  38. {
  39. parent::__construct($stream, $delimiter, $enclosure);
  40. $this->map = $map;
  41. }
  42. public function get_map()
  43. {
  44. return $this->map;
  45. }
  46. /**
  47. *
  48. * @param object $item
  49. * @return boolean
  50. */
  51. public function put($item)
  52. {
  53. $data = $this->convert($item);
  54. if (empty($data)) {
  55. return false;
  56. }
  57. $this->writer_headers();
  58. parent::put($data);
  59. return true;
  60. }
  61. /**
  62. * Convert object to array of data
  63. * @param object $object
  64. * @return array
  65. */
  66. protected function convert($item)
  67. {
  68. $result = array();
  69. $map = $this->map;
  70. if ($map == '*') {
  71. return (array) $item;
  72. }
  73. foreach ($map as $key => $value) {
  74. $result[$key] = isset($item->{$key}) ? $item->{$key} : '';
  75. }
  76. return $result;
  77. }
  78. /**
  79. *
  80. * @param array $items
  81. */
  82. public function add_all($items)
  83. {
  84. foreach ($items as $item) {
  85. $this->add($item);
  86. }
  87. }
  88. /**
  89. *
  90. * @param array|object $item
  91. */
  92. public function add($item)
  93. {
  94. if (is_array($item)) {
  95. $this->add_all($item);
  96. return;
  97. }
  98. $this->put($item);
  99. }
  100. protected function writer_headers()
  101. {
  102. if ($this->headers_written) {
  103. return;
  104. }
  105. $this->headers_written = true;
  106. $map = $this->map;
  107. if (!is_array($map)) {
  108. return;
  109. }
  110. $headers = array();
  111. foreach ($map as $key => $value) {
  112. $headers[] = $value;
  113. }
  114. parent::put($headers);
  115. }
  116. }