Diskuze: Jak na funkci Find ze C#

PHP PHP Jak na funkci Find ze C# American English version English version

Avatar
Jakub Lásko[Saarix]:

Zdravím,

dělám jádro jednoho projektu v PHP a bojuji s jedním řešením... :( Mám prototyp v C# a tam častou používám Llist<T> a na něm metodu Find().

Nyní hledám způsob jak toto přepsat do PHP:

players.FindAll(x => x.IsAlive == true);

Nebo

items.Find(i => i.Position[0] == X && i.Position[1] == Y);

Napadlo mě zattím něco takového, ale myslím, že jsem asi vedle:

/**
* Returns the first element that met specified
* condition in callback function from an array.
* @param $array
* @param callable $callback
* @return object
*/
public static function First($array, callable $callback)
{
$result = null;
$count = count($array);

for ($i = 0; $i < $count; $i++)
{
// When we find first element that met the condition in callback
// we stop the loop and return the result
if (call_user_fun­c($callback, $array[$i]))
{
$result = &$array[$i];
break;
}
}

return $result;
}

/**
* Searches array for a specific object
* and if exists it will return it.
* @param array $array
* @param mixed $object
* @return mixed
*/
public static function Find($array, $object)
{
$result = null;
if (($key = array_search($ob­ject, $array)) !== false)
$result = &$array[$key];

return $result;
}

Ta funkce Find by měla vrátit objekt z array, který se rovná předanému objektu, to by snad mělo fungovat dobře. Ale ta funkce First, kde callback má nahradit predicate ze C#, tam to nějak hapruje :(
Nemá někdo nějaký nápad, jak řešit hledání v array na základě predicate, jako to je v C#?

Díky.

Odpovědět 24.8.2015 13:13
Časem je vše možné.
Avatar
Jakub Šárník:

Jen ze zajímavosti - proč přepisovat z C# do PHP?

 
Nahoru Odpovědět 24.8.2015 19:18
Avatar
dobrakmato
Člen
Avatar
Odpovídá na Jakub Lásko[Saarix]
dobrakmato:

Napisal som teraz nieco na podobny styl, ako si spravil ty, a mne to funguje uplne v pohode. Podobnym sposobom mozes implementovat aj funkcie Last a dalsie. Ak mas nejake otazky pytaj sa.

<?php

// Testing array.
$array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

/**
 * Returns array of all items in specified input array that matches specified
 * predicate.
 *
 * @param $array input array
 * @param callable $predicate predicate
 * @return array array of items from input array that matches specified predicate
 */
function FindAll($array, Callable $predicate) {
    $results = array();

    foreach ($array as $item) {
        if ($predicate($item)) {
            $results[] = $item;
        }
    }

    return $results;
}

/**
 * Returns first item from input array that matches specified predicate or null if
 * there was no item that matched specified predicate in the input array.
 *
 * @param $array input array
 * @param callable $predicate predicate
 * @return mixed|null item or null if no item was found
 */
function First($array, Callable $predicate) {

    foreach ($array as $item) {
        if ($predicate($item)) {
            return $item;
        }
    }

    return null;
}

// Test funkcionality.

$parne = function ($item) {
    return ($item % 2) == 0;
};

var_dump(First($array, $parne));
var_dump(FindAll($array, $parne));
var_dump(FindAll($array, function ($item) {
    return ($item % 2) != 0;
}));

Output z phpcka:

php predicate.php

int(2)
array(5) {
[0]=>
int(2)
[1]=>
int(4)
[2]=>
int(6)
[3]=>
int(8)
[4]=>
int(10)
}
array(5) {
[0]=>
int(1)
[1]=>
int(3)
[2]=>
int(5)
[3]=>
int(7)
[4]=>
int(9)
}

php -version
PHP 5.6.10 (cli) (built: Jun 10 2015 15:58:53)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

Editováno 24.8.2015 22:17
Nahoru Odpovědět  +1 24.8.2015 22:14
Čekni stránku so zabavnými obrázkami z internetov: https://www.coolovo.eu?ref=1007
Avatar
dobrakmato
Člen
Avatar
Odpovídá na Jakub Lásko[Saarix]
dobrakmato:

Ja by som teda asi ale doporucil napisanie interfacu List a implementacie ArrayList, aby tie funckie niekam partili a neboli v global scope.

Nahoru Odpovědět 24.8.2015 22:19
Čekni stránku so zabavnými obrázkami z internetov: https://www.coolovo.eu?ref=1007
Avatar
Michal Žůrek (misaz):

a nepostačí ti obyčejná http://php.net/…y-filter.php ?

array_filter(players, function (x) { return x.IsAlive; });
Nahoru Odpovědět 24.8.2015 22:34
Nesnáším {}, proto se jim vyhýbám.
Avatar
Odpovídá na Jakub Šárník
Jakub Lásko[Saarix]:

Nejprve jsem si to testoval a C# mě byl příjemnější, protože PHP sem se teprv k tomu musel naučit abych to přepsal :)

Nahoru Odpovědět 25.8.2015 6:21
Časem je vše možné.
Avatar
Odpovídá na Michal Žůrek (misaz)
Jakub Lásko[Saarix]:

Asi ano, ale problém je, pokud mám toto:

public function Test($parametr)
{
        array_filter($players, function($x) { return $x->Promenna == $parametr; });
}

Tak toto nefunguje, protože v té funkci v array_filtr není $parametr vidět. Ale toto použití docela vyžaduji, abych byl schopný ve funkci porovnávat hodnoty co mám jako parametry :(

Nahoru Odpovědět 25.8.2015 6:25
Časem je vše možné.
Avatar
Jakub Lásko[Saarix]:

Abych jen doplnil, tak ty funkce co jsem si napsal fungují, jen už zbývá ten problém, jak sem popsal teď nad tímhle postem. Jak dostat do callback funkce nějaký parametr :(

Jinak díky všem, za dosavadní pomoc :-)

Nahoru Odpovědět 25.8.2015 7:11
Časem je vše možné.
Avatar
Nahoru Odpovědět 25.8.2015 7:18
Časem je vše možné.
Avatar
Ori
Člen
Avatar
Ori:

poprípade môžeš použiť tento package https://github.com/…nate/support (Collections)

je to vlastne port z frameworku laravel

dokumentáciu nájdeš tu http://laravel.com/…/collections#…

 
Nahoru Odpovědět  -1 25.8.2015 8:29
Avatar
Tukmak
Člen
Avatar
Odpovídá na Jakub Lásko[Saarix]
Tukmak:

Pokud chceš používat externí parametry v anonymní funkci, musíš použít klíčové slovo use:

public function Test($parametr)
{
        array_filter($players, function($x) use ($parametr) { return $x->Promenna == $parametr; });
}
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +3 25.8.2015 9:12
Avatar
Odpovídá na Tukmak
Jakub Lásko[Saarix]:

Díky moc Tukmak a dobrakmato vaše řešení dohromady konečně vytvoří řešení přesně takové jaké jsem hledal ;)

Opravdu moc děkuji všem ve vláknu za pomoc.

Nahoru Odpovědět 25.8.2015 9:49
Časem je vše možné.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.