helpers_array.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <?php
  2. use \KarmaFW\App;
  3. use \KarmaFW\App\ResponseText;
  4. use \PhpOffice\PhpSpreadsheet\IOFactory as PhpSpreadsheetIOFactory;
  5. if (! function_exists('arrayReduceToOneColumn')) {
  6. function arrayReduceToOneColumn($array, $column_key) {
  7. return array_map(function($row) use ($column_key) {
  8. if (is_callable($column_key)) {
  9. return $column_key($row);
  10. } else {
  11. return $row[$column_key];
  12. }
  13. }, $array);
  14. }
  15. }
  16. if (! function_exists('arrayAddKeyFromColumn')) {
  17. function arrayAddKeyFromColumn($array, $column_key) {
  18. $results = array();
  19. foreach ($array as $row) {
  20. if (is_callable($column_key)) {
  21. $key = $column_key($row);
  22. } else if (is_array($column_key)) {
  23. $key_parts = [];
  24. foreach ($column_key as $column_key_item) {
  25. $key_parts[] = $row[$column_key_item];
  26. }
  27. $key = implode('-', $key_parts);
  28. }else{
  29. $key = $row[$column_key];
  30. }
  31. $results[$key] = $row;
  32. }
  33. if (empty($results)) {
  34. //return new stdClass();
  35. }
  36. return $results;
  37. }
  38. }
  39. if (! function_exists('arrayGroupByColumn')) {
  40. function arrayGroupByColumn($array, $column_key, $preserve_keys=true) {
  41. $results = array();
  42. foreach ($array as $k => $v) {
  43. if (is_callable($column_key)) {
  44. $key_value = $column_key($v);
  45. } else {
  46. $key_value = $v[$column_key];
  47. }
  48. if (! isset($results[$key_value])) {
  49. $results[$key_value] = array();
  50. }
  51. if ($preserve_keys) {
  52. $results[$key_value][$k] = $v;
  53. } else {
  54. $results[$key_value][] = $v;
  55. }
  56. }
  57. return $results;
  58. }
  59. }
  60. if (! function_exists('arrayToList')) {
  61. function arrayToList($array) {
  62. $results = array();
  63. $db = App::getDb();
  64. foreach ($array as $k => $v) {
  65. $results[] = $db->escape($v);
  66. }
  67. return implode(', ', $results);
  68. }
  69. }
  70. if (! function_exists('import_xls')) {
  71. function import_xls($filepath, $fields=[], $encode_utf8=false) {
  72. $spreadsheet = PhpSpreadsheetIOFactory::load($filepath);
  73. //$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
  74. //$reader->setReadDataOnly(true);
  75. //$spreadsheet = $reader->load($filepath);
  76. $sheetData = $spreadsheet->getActiveSheet()->toArray();
  77. //pre($sheetData, 1);
  78. $headers = [];
  79. if (! empty($fields)) {
  80. $headers = $fields;
  81. }
  82. $rows = [];
  83. $line_idx = 0;
  84. foreach ($sheetData as $input_row) {
  85. $line_idx++;
  86. if ($line_idx <= 1) {
  87. // ligne d'entete
  88. if (empty($headers)) {
  89. foreach ($input_row as $key => $value) {
  90. if ($encode_utf8) {
  91. $headers[$key] = utf8_encode($value);
  92. } else {
  93. $headers[$key] = $value;
  94. }
  95. }
  96. }
  97. continue;
  98. }else{
  99. // lignes de data
  100. $row = [];
  101. $row_ok = true;
  102. $col_idx = 0;
  103. foreach ($input_row as $key => $value) {
  104. $col_idx++;
  105. if ($col_idx > count($headers)) {
  106. continue;
  107. }
  108. if (! isset($headers[$key])) {
  109. $row_ok = false;
  110. //pre($input_row);
  111. break;
  112. }
  113. $header_key = $headers[$key];
  114. if ($encode_utf8) {
  115. $row[$header_key] = utf8_encode($value);
  116. } else {
  117. $row[$header_key] = $value;
  118. }
  119. }
  120. if ($row_ok) {
  121. $rows[] = $row;
  122. }
  123. }
  124. }
  125. return $rows;
  126. }
  127. }
  128. if (! function_exists('import_csv')) {
  129. function import_csv($filepath, $separator=";", $fields=[], $encode_utf8=true) {
  130. $rows = [];
  131. $handle = fopen($filepath, "r");
  132. $headers = [];
  133. if (! empty($fields)) {
  134. $headers = $fields;
  135. }
  136. $line_idx = 0;
  137. while (($input_row = fgetcsv($handle, 4096, $separator)) !== false) {
  138. $line_idx++;
  139. if ($line_idx <= 1) {
  140. // ligne d'entete
  141. if (empty($headers)) {
  142. foreach ($input_row as $key => $value) {
  143. if ($encode_utf8) {
  144. $headers[$key] = utf8_encode($value);
  145. } else {
  146. $headers[$key] = $value;
  147. }
  148. }
  149. }
  150. continue;
  151. }else{
  152. // lignes de data
  153. $row = [];
  154. foreach ($input_row as $key => $value) {
  155. $header_key = $headers[$key];
  156. if ($encode_utf8) {
  157. $row[$header_key] = utf8_encode($value);
  158. } else {
  159. $row[$header_key] = $value;
  160. }
  161. }
  162. $rows[] = $row;
  163. }
  164. }
  165. fclose($handle);
  166. return $rows;
  167. }
  168. }
  169. if (! function_exists('get_csv')) {
  170. function get_csv($arr, $fields=array(), $sep=";") {
  171. $str = '';
  172. if (! empty($arr)) {
  173. if (empty($fields)) {
  174. $fields = array_keys($arr[0]);
  175. }
  176. $line = array();
  177. foreach ($fields as $k => $v) {
  178. if (! is_numeric($k)) {
  179. $line[] = $k;
  180. } else {
  181. $line[] = $v;
  182. }
  183. }
  184. $str .= implode($sep, $line) . PHP_EOL;
  185. foreach ($arr as $row) {
  186. $line = array();
  187. foreach ($fields as $field) {
  188. $val = $row[$field];
  189. if (is_numeric($val) && strlen($val."") > 1) {
  190. // pour exporter correctement dans Excel les valeurs numériques
  191. $val = '="' . $val . '"';
  192. }
  193. $line[] = $val;
  194. }
  195. //$str .= implode($sep, $line) . PHP_EOL;
  196. //$str .= '"' . implode('"' . $sep . '"', str_replace('"', '\\"', $line)) . '"' . PHP_EOL;
  197. $str .= '"' . implode('"' . $sep . '"', str_replace('"', '""', $line)) . '"' . PHP_EOL;
  198. }
  199. }
  200. return $str;
  201. }
  202. }
  203. if (! function_exists('exportToCsvFile')) {
  204. function exportToCsvFile($rows, $export_filename=null, $fields=null) {
  205. $csv_content = get_csv($rows, $fields);
  206. if (! empty($export_filename)) {
  207. // download file
  208. header('Content-Type: text/csv');
  209. header('Content-Disposition: attachment;filename=' . basename($export_filename));
  210. header("Pragma: no-cache");
  211. header("Expires: 0");
  212. } else {
  213. // show in browser
  214. header('Content-Type: text/plain');
  215. }
  216. echo $csv_content;
  217. exit;
  218. /*
  219. if (! empty($export_filename)) {
  220. $content_type = 'text/csv';
  221. $headers = [
  222. 'Content-Disposition: attachment;filename=' . basename($export_filename),
  223. "Pragma: no-cache",
  224. "Expires: 0"
  225. ];
  226. } else {
  227. $headers = [];
  228. $content_type = 'text/plain';
  229. }
  230. throw new ResponseText($csv_content, 200, $content_type, $headers);
  231. */
  232. }
  233. }
  234. if (! function_exists('array_map_with_keys')) {
  235. function array_map_with_keys($func, $array) {
  236. $ret = [];
  237. foreach ($array as $k => $v) {
  238. $ret[$k] = $func($v, $k);
  239. }
  240. return $ret;
  241. }
  242. }