За последние 24 часа нас посетили 18797 программистов и 1710 роботов. Сейчас ищут 968 программистов ...

array_keys

Тема в разделе "PHP для новичков", создана пользователем Koc, 29 июн 2008.

  1. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    дано
    [marks] => Array
    (
    [10] => 6,7,10
    [12] => 8,9,11
    [36] => 7,1,12
    [334] => 7,10,12
    [777] => 6,9,10
    )
    array_keys($marks, 6) вернет 10, 777 , что в общем то верно.
    В то же время array_keys($marks, 10) ничего полезного не вернет, хотя ожидал 10,334,777.
    Получается, что ищет не по всему значению а только с начала этого значения. Как быть?

    В теории можно разбить каждый элемент на еще один массив и искать там. Если нашли - возвращаем ключ. Но это долго и глупо. Может есть какие-то другие варианты?
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Объясняю поведение функции:
    PHP:
    1. <?
    2. '6,7,10' == 6; // true
    3. '6,7,10' == 10; // false
    php преобразует тип выражения слева в тип выражения справа
    PHP:
    1. <? echo intval('6,7,10'); // 6
     
  3. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Koc
    Это медвежья услуга от PHP.
    Нельзя искать (по крайней мере с помощью array_keys) среди значений, перечисленных через запятую. В твоем случае PHP просто приводит каждую из строк к числу (получается 6, 8, 7, 7, 6), поэтому такие результаты.

    Нет, не глупо, поскольку у тебя данные сформированы в неудобоваримом виде.
    Можно написать функцию-фильтр (лямбду) и скормить ее функции array_filter, все равно тебе наверняка понадобятся не только ключи, но и значения:
    PHP:
    1. <?php
    2. $search=10;
    3. $callback=create_function("\$a","return in_array($search,explode(',',\$a));");
    4. $found=array_filter($marks,$callback);
     
  4. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    спасибо за разъяснения. Функция-лямбда очень помогла. Сам бы такую не написал.