[megoldva] Tömbszorzás

Ami pythonban egyszerű szorzással megy, az php-ban némileg körülményes, mert itt nincs lehetőség pl. [3,4,5] * 2.4 használatára.
Ehelyett egy gyalogos (és nem elegáns) megoldás:

function m ($a,$c) {
    $r=[];
    foreach($a as $b){ $r[] = $b * $c; }
    return $r;
}
print_r(m([1,4,5], 4.2));

    [0] => 4.2
    [1] => 16.8
    [2] => 21

Ehelyett itt: https://riptutorial.com/php/example/26837/comparison-between-bcmath-and-float-arithmetic-operations javasolnak pár array_map-es megoldást, de olyat nem találtam, ahol meg lehet adni paraméterként is a szorzót.

A gond valahogy a láthatósággal van; ehelyett szeretnék egy működő (kétparaméteres) array_map megoldást, ami lehetőleg nem teszi be másik tömbként (többszörözve) a szorzót:

$input = [2,3,4];
$c = 3;
print_r( array_map(function($el) { return $el * $c; }, $input) );

   Undefined variable: c

Hozzászólások

Az array_map-nek csak tömböket lehet átadni. Vagy úgy oldod meg, hogy a szorzót kiteszed globális változóba és azzal dolgozol a callback függvényben, vagy megírod magadnak a saját array_map-edet, ami elfogad egy mezei változót második paraméternek és átadja a callback függvénynek.

function array_map2p($callback, $array, $variable)
{
	foreach ($array as $value)
	{
		$callback($value, $variable);
	}
}

Vagy valami hasonló...

print_r( array_map(function($el) { global $c; return $el * $c; }, $input) );

Nem válasz a kérdésre, de tulajdonképpen mi a baj azzal, ha a kódban az van, amit csinálni akarsz?

Csak szebben kell leírni:

function multiplyArrayByScalar ($array, $scalar) {
  $result=[];
  foreach($array as $actualElement){
    $result[] = $actualElement * $scalar; }
    return $result;
}

Igen, igazából nincs ezzel sem semmi baj. Csak a kívánt funkció annyira eleminek tűnt, hogy gyanús volt, hogy biztosan van erre valami hatékonyabb megoldás, amiben a ciklust nem ilyen prózai foreach-csel kell végigvinni. Az volt a sejtésem, hogy ennél lehet gyorsabb megoldás, ami valahogy a motorháztető alatt (esetleg párhuzamosítva) intézi az iterációt.

Arról nem is beszélve, hogy előbb-utóbb úgyis használja majd valaki ezt a tömböt, akinek dolga lesz végigmenni rajta, és akár ott is elvégezhető ez a szorzás...

print_r( array_map(function($el) use($c) { return $el * $c; }, $input) );

Erre egy kicsit kibővítve, ha nem akarjuk a névteret teleszemetelni :)

<?php
function times($number) {
        return function($x) use ($number) {
                return $x * $number;
        };
}

var_dump(array_map(times(4.2), [1,4,5]));

Szerk.: átneveztem a függvényt, hogy jobb legyen a neve, array_times volt eredetileg, de az meh, mert csak ebben a kontextusban van köze az arrayekhez :)

BlackY

"Gyakran hasznos ugyanis, ha számlálni tudjuk, hányszor futott le már egy végtelenciklus." (haroldking)

Szerkesztve: 2020. 08. 07., p - 17:41

@szz: Azért Python3-ban sem olyan egyszerű, ahogy írtad a témaindítóban:

>>> [3,4,5] * 3
[3, 4, 5, 3, 4, 5, 3, 4, 5]

Nézzük, hogyan lehet:
>>> input = [4, 5, 6]
>>> c = 3

>>> out = list(map(lambda x: x * c, input))
>>> print (out)

Mellékesen Rust esetén is a Pythonhoz hasonló, bár nekem a következetes iterátor logikája jobban kézreáll: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist…