NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Jak na funkci Find ze C#

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jakub Lásko[Saarix]:24.8.2015 13:13

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:
<code>
players.FindAll(x => x.IsAlive == true);
</code>
Nebo
<code>
items.Find(i => i.Position[0] == X && i.Position[1] == Y);
</code>

Napadlo mě zattím něco takového, ale myslím, že jsem asi vedle:
<code>
/**
* 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;
}
</code>

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
Neaktivní uživatel:24.8.2015 19:18

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

Nahoru Odpovědět
24.8.2015 19:18
Neaktivní uživatelský účet
Avatar
dobrakmato
Člen
Avatar
Odpovídá na Jakub Lásko[Saarix]
dobrakmato:24.8.2015 22:14

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
24.8.2015 22:14
Avatar
dobrakmato
Člen
Avatar
Odpovídá na Jakub Lásko[Saarix]
dobrakmato:24.8.2015 22:19

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
Avatar
Michal Žůrek - misaz:24.8.2015 22:34

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
Avatar
Odpovídá na Neaktivní uživatel
Jakub Lásko[Saarix]:25.8.2015 6:21

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]:25.8.2015 6:25

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]:25.8.2015 7:11

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 I
Člen
Avatar
Ori I:25.8.2015 8:29

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
25.8.2015 8:29
Avatar
Tukmak
Člen
Avatar
Odpovídá na Jakub Lásko[Saarix]
Tukmak:25.8.2015 9:12

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í
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
25.8.2015 9:12
Avatar
Odpovídá na Tukmak
Jakub Lásko[Saarix]:25.8.2015 9:49

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.