LINUX.ORG.RU

Без промежуточной переменной тут никак. Один из реальных минусов PHP :)

Либо промежуточная переменная, либо возвращать не массив, а пустой класс из двух property и обращаться к ним:

class point { var $x, $y; function __construct($x, $y) { $this->x = $x; $this->y = $y; } }

и потом:

function f() { return new point(12, 34); }

echo f()->x;

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>Либо промежуточная переменная, либо возвращать не массив, а пустой класс из двух property и обращаться к ним

Тем не менее over 90% PHP библиотек возвращают массивы.

BTW спасибо за совет, думал с объектами та же фигня. Но почему бы им не сделать массив объектом, с методом nth() для получения объекта по номеру или по ключу?

Следующий вопрос:

У меня есть массив массивов. Мне нужно в каждом массиве убрать те элементы, которые больше чем первый элемент. Поскольку у меня ФП головного мозга то я хочу сделать так:

<? foreach ($array as $value) { array_filter($array, function($e){ return $e > $array[0] }); } ?>

Получаю syntax error, unexpected T_FUNCTION

Что делать?

future-of-the-lor
() автор топика
Ответ на: комментарий от future-of-the-lor

function(){..} не возвращает замыкания. Это только в PHP 5.3 так
сделали, который пока не релизный.

1. В старом нужно использовать только громоздкий create_function.

В духе 
array_filter($array, create_function('$e', 'return $e > $array[0];')); 
(неверно, потому что см. пункт 2)

2. Даже с замыканием - у тебя неверный код. Ты внутри функции
обращаешься к переменной $array, которой нет в области видимости
функции. В общем, твой пример должен быть таким:

<?php

$array_of_array = array(
    array(1,2,3,0,1,2),
    array(5,1,2,4,5,7),
);

$result = array();
foreach($array_of_array as $array)
{
    $GLOBALS['first'] = $array[0];

    $result[] = array_filter($array,
        create_function('$x', 'return $x <= $GLOBALS["first"];'));
}

print_r($result);

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Результат:

$ php 1.php 
Array
(
    [0] => Array
        (
            [0] => 1
            [3] => 0
            [4] => 1
        )

    [1] => Array
        (
            [0] => 5
            [1] => 1
            [2] => 2
            [3] => 4
            [4] => 5
        )

)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Ну вот аналогичный моему коду код на ruby.

a = [[1,2,3,0,1,2],
     [5,1,2,4,5,7]]
     
a.each do |v|
  v.delete_if{|e| e > v.first}
end

p a #=> [[1, 0, 1], [5, 1, 2, 4, 5]]

Он работает! Так что с точки зрения функционального программирования я пишу 
правильно. Отсюда вытекает что в PHP 5.3 нет правильной лямбды, если внутри неё не 
доступны переменные в области видимости её создания.

То что ты написал с $GLOBALS — костыль. Представь, что мне нужно в массиве сохранить 
созданную лямбду последним элементом. В языке с нормальными лямбдами я смогу, а в 
PHP нет. Уж поверь, иногда такое нужно.

future-of-the-lor
() автор топика
Ответ на: комментарий от future-of-the-lor

>Отсюда вытекает что в PHP 5.3 нет правильной лямбды, если внутри неё не доступны переменные в области видимости её создания.

Может и доступны. Я 5.3 пока не видел :)

>То что ты написал с $GLOBALS — костыль

Безусловно.

KRoN73 ★★★★★
()

array_shift, array_pop. и никаких вспомогательных переменных.

если f :: () -> [x,y], то array_shift(f()) = x, array_pop(f()) = y.

kkw
()
Ответ на: комментарий от KRoN73

Твой код:

$array_of_array = array( array(1,2,3,0,1,2), array(5,1,2,4,5,7), );

$result = array(); foreach($array_of_array as $array) { $GLOBALS['first'] = $array[0];

$result[] = array_filter($array, create_function('$x', 'return $x <= $GLOBALS["first"];')); }

можно переписать так:

foreach ($array_of_array as $array) { $first = $array[0]; $result[] = array_filter($array, create_function('$x', 'return $x <= '.$first.';')); }

:)

и будет ему недозамыкание.

kkw
()
Ответ на: комментарий от kkw

Если я правильно понял задачу -- надо сделать из списка списков чисел список списокв, в к-х эл-ты не больше первого эл-та исходного списка. Или не?

kkw
()
Ответ на: комментарий от KRoN73

Твоя реализация даёт точно такой же результат.

kkw
()
Ответ на: комментарий от kkw

Пардон, я контактенацию $first в конце не усмотрел.

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.