Чтобы предотвратить создание бесполезных точек выбора, используйте отставание, чтобы извлечь выгоду из индексации первого аргумента:
list_butlast([X|Xs], Ys) :- % use auxiliary predicate ...
list_butlast_prev(Xs, Ys, X). % ... which lags behind by one item
list_butlast_prev([], [], _).
list_butlast_prev([X1|Xs], [X0|Ys], X0) :-
list_butlast_prev(Xs, Ys, X1). % lag behind by one
Примеры запросов:
?- list_butlast([], Xs).
false.
?- list_butlast([1], Xs).
Xs = []. % succeeds deterministically
?- list_butlast([1,2], Xs).
Xs = [1]. % succeeds deterministically
?- list_butlast([1,2,3], Xs).
Xs = [1,2]. % succeeds deterministically
Как насчет другого направления?
?- list_butlast(Xs, []).
Xs = [_A].
?- list_butlast(Xs, [1,2,3]).
Xs = [1,2,3,_A].
Как насчет наиболее общего запроса?
?- list_butlast(Xs, Ys).
Xs = [_A] , Ys = []
; Xs = [_A,_B] , Ys = [_A]
; Xs = [_A,_B,_C] , Ys = [_A,_B]
; Xs = [_A,_B,_C,_D] , Ys = [_A,_B,_C]
; Xs = [_A,_B,_C,_D,_E], Ys = [_A,_B,_C,_D]
⋯
Я не использую PhpSpreadsheet, но, посмотрев их документацию , getNamedRanges
возвращает массив NamedRange
с именами, он не возвращает только одни имена. Так что вам нужно получить имя из диапазона, например -
foreach ($spreadsheet->getNamedRanges() as $range) {
temp_name[] = $range->getName();
}
также re: print_r("<br>Temp Name<br>");
для строк, просто используйте print '..';
, print_r()
для массивов.