[PHP] Eigen array-zoekfunctie retourneert altijd false

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Om in een associatieve array te kunnen zoeken heb ik de volgende functie:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$my_array = array(
  array('link'=>'dit', 'title'=>'Dittes'),
  array('link'=>'dat', 'title'=>'Dattes'),
  array('link'=>'het', 'title'=>'Hettes')
);

function in_assoc_array($needle, $array)
{
  for ($i = 0; $i <= count($array); $i++)
  {
    if (in_array($needle, $array[$i]))
      return $i;
    else
      return false;
  }
} 

echo in_assoc_array('het', $my_array); // retourneert false


Als ik de functie nu aanroep, bijvoorbeeld met in_assoc_array('het', $my_array); geeft de functie false terug. Ik staar er nu al een tijdje op, maar weet niet waar hem de voud zit. 'het' Zit namelijk duidelijk in de array...wie ziet het wel?

[ Voor 19% gewijzigd door Reveller op 14-12-2004 22:20 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

Je doorzoekt een associatieve array met een numerieke index. Uit mijn hoofd zou je dit moeten doen
PHP:
1
2
3
4
5
6
7
8
function in_assoc_array($needle,$array)
{
    foreach($array as $key => $value) 
    {
        if($value==$needle) return true;
    }
    return false;
}
Het kan korter, maar ter preventie van een grondige layoutfuckup heb ik die accolades neergezet. Je kan natuurlijk ook de functie aanpassen om recursief in zichzelf te zoeken (meerdemensionale associatieve arrays). Succes met je gepiel.

[ Voor 1% gewijzigd door Verwijderd op 14-12-2004 22:44 . Reden: Stomme spatiebalk, bedankt Maarten21 :) ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ga gewoon eens stapje voor stapje door je code om te kijken wat er gebeurt. Bedenk daarbij dat zodra je een return doet je de functie uitspringt. Wat zou er gebeuren zodra het allereerste element niet het gezochte element is? Komt hij uberhaupt bij het controleren van het tweede element?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Maarten21
  • Registratie: Juli 2003
  • Laatst online: 19-09 10:22
Wat jeroen_paul zegt is bijna goed...
alleen moet het foreach zijn :)
dus <code>foreach ($array as $key => $value)</code>

In jouw geval bestaat $my_array[0] en $my_array[1] niet.
foreach gaat alle _keys_ af, dus in jouw geval 'link' en 'title'
dus $my_array['link'] en $my_array['title']

Acties:
  • 0 Henk 'm!

  • Rostvertol-Mil
  • Registratie: Januari 2002
  • Laatst online: 15:42
Zoals Janoz al zegt: je functie returnt al als de eerste index geen "het" bevat, dus verder dan de eerste index komt hij heel niet.

Dit zou echter wel moeten werken. Elke index wordt nu nagelopen, en als het klopt returnt ie de index (en stopt de functie dus ook) , als er geen enkele klopt returnt ie false.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
$my_array = array(
  array('link'=>'dit', 'title'=>'Dittes'),
  array('link'=>'dat', 'title'=>'Dattes'),
  array('link'=>'het', 'title'=>'Hettes')
);

function in_assoc_array($needle, $array)
{
  for ($i = 0; $i <= count($array); $i++)
  {
    if (in_array($needle, $array[$i]))
      return $i;
  }
    return false;
} 

echo in_assoc_array('het', $my_array);
?>


Edit: @ Jeroen Paul:
De functie van de TS kijkt of de value bestaat in een array in een array, jouw functie doet hetzelfde als in_array();

Deze versie zou ik zelf gebruiken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?


function in_assoc_array($needle, $array)
{
  foreach($array as $key => $value) 
  {
    if (in_array($needle, $value))
      return $key;
  }
    return false;
} 

echo in_assoc_array('het', $my_array); 
?>

[ Voor 46% gewijzigd door Rostvertol-Mil op 14-12-2004 22:49 ]

dot.blaat