PHP - извлечение объекта min () из массива многомерных объектов - PullRequest
1 голос
/ 02 марта 2011

** РЕДАКТИРОВАТЬ ** Что бы произошло, если бы я использовал только массивы, например

массив ( массив ('name' => 'bla', 'distance' => '123'); массив ('name' => 'b123a', 'distance' => '1234214'); );

Было бы легче найти минимальное значение?

Привет, я пытаюсь получить объект, который имеет наименьшее значение расстояния из массива объектов. Это мой набор данных ниже;

    [0] => myObjectThing Object
        (
            [name:myObjectThing:private] => asadasd
            [distance:myObjectThinge:private] => 0.9826368952306
        )

    [1] => myObjectThing Object
        (
            [name:myObjectThing:private] => 214gerwert24
            [distance:myObjectThinge:private] => 1.5212312547306
        )

    [2] => myObjectThing Object
        (
            [name:myObjectThing:private] => abc123
            [distance:myObjectThinge:private] => 0.0000368952306
        )

Так что я бы хотел иметь возможность повторно получить объект, который имеет наименьшее значение расстояния. В этом случае это будет объект с именем: abc123

Ответы [ 6 ]

9 голосов
/ 02 марта 2011

Хм для PHP> = 5.3 Я бы попробовал что-то вроде этого:

$Object = array_reduce($data,function($A,$B){
    return $A->distance < $B->distance ? $A : $B;
})

Для PHP <5.3 достаточно было бы:

4 голосов
/ 15 августа 2012

Ранее предложенные ответы не объясняли необходимость включения значения $initial в array_reduce(). Решение не сработало из-за этого.

Этот работает для меня (PHP 5.3.13):

$array = array(
    array(
        'name' => 'something',
        'value' => 56
    ),
    array(
        'name' => 'else',
        'value' => 54
    ),
    array(
        'name' => 'else',
        'value' => 58
    ),
    array(
        'name' => 'else',
        'value' => 78
    )
);
$object = array_reduce($array, function($a, $b){
    return $a['value'] < $b['value'] ? $a : $b;
}, array_shift($array));

print_r($object);

Это даст мне:

[0] => Array
(
    [name] => else
    [value] => 54
)

Тогда как предыдущее решение дало мне null. Я предполагаю, что PHP <5.3 потребует, чтобы аналогичное начальное значение было указано в <code>array_reduce().

0 голосов
/ 02 марта 2011

попробуй:

$myObjectCollection = ...;
$minObject = $myObjectCollection[0]; // or reset($myObjectCollection) if you can't ensure  numeric 0 index

array_walk($myObjectCollection, function($object) use ($minObject) { 
        $minObject = $object->distance < $minObject->distance ? $object : $minObject;
});

но судя по твоему дампу.name и distance являются частными.Таким образом, вы хотите иметь возможность получить к ним доступ непосредственно с помощью ->.Вам понадобится какой-нибудь добытчик getDistance()

0 голосов
/ 02 марта 2011

Этот пример должен дать вам подсказку в правильном направлении:

<?php

$a = new stdClass();
$a->foo = 2;
$b = new stdClass();
$b->foo = 3;
$c = new stdClass();
$c->foo = 1;

$init = new stdClass();
$init->foo = 1000;

$vals = array( $a, $b, $c );

var_dump(
    array_reduce(
        $vals,
        function ( $x, $y )
        {
            if ( $x->foo < $y->foo )
            {
                return $x;
            }   
            else
            {
                return $y;
            }   
        },  
        $init
    )   
);  

?>
0 голосов
/ 02 марта 2011
$objectsArray = array(...); // your objects
$distance     = null;
$matchedObj   = null;

foreach ( $objectsArray as $obj ) {
   if ( is_null($distance) || ( $obj->distance < $distance ) ) {
      $distance   = $obj->distance;
      $matchedObj = $obj;
   }
}

var_dump($matchedObj);

AD EDIT:

Если вы будете использовать массивы вместо объектов, измените $obj->distance на $obj['distance'].

0 голосов
/ 02 марта 2011

Вы не можете сгладить это, поскольку это не простой старый многомерный массив только с значениями.

Это должно работать:

$min = $object[0];
for ($i = 1; $i < count($object); $i++)
    if ($object[$i]['distance'] < $min['distance'])
        $min = $object[$i];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...