0

オブジェクトの配列をオブジェクトのキー値配列にマップする最も簡単な方法は何ですか?ここで、キーはオブジェクトのプロパティです?

例えば:

class Cartoon
{
  public $title;
  public function __construct($title)
  {
    $this->title = $title;
  }
}

$cartoons = array(new Cartoon('Tom and Jerry'), new Cartoon('Cheburashka'));

$mappedCartoons = array();

foreach ($cartoons as $cartoon)
{
  $mappedCartoons[$cartoon->title] = $cartoon;
}

print_r ($mappedCartoons);

PS。繰り返しと余分な変数$mappedCartoonsを処分できるのだろうか?

4

3 に答える 3

4

array_reduceあなたはあなたの目標を達成するために使用することができます。

<?php

$cartoons = array_reduce($cartoons, function($result, $cartoon) {
  $result[$cartoon->title] = $cartoon;
  return $result;
}, array());

?>

アイデアは私のものではありません。ここにあります:http ://www.danielauener.com/howto-use-array_map-functionality-on-an-associative-array-changing-keys-and-values/

于 2012-11-21T14:25:34.270 に答える
0

基本的な配列を使用する必要がある場合は、作成時にキーを入力するだけです。

$cartoons = array(
    'Tom and Jerry' => new Cartoon('Tom and Jerry'), 
    'Cheburashka' => new Cartoon('Cheburashka'),
);

または、さまざまな配列/反復関連のインターフェイスを実装し、通常の配列として使用できるコンテナー オブジェクトを作成できます。

class CartoonArray extends ArrayObject {

    public function __construct($input, $flags = 0, $iterator_class = "ArrayIterator") {
        parent::__construct(array(), $flags, $iterator_class);
        // since the original ArrayObject implemented in C and they don't it won't pick up our overriden ossetSet we have to type it out here explicitly
        foreach ($input as $value) {
            $this->offsetSet(null, $value);
        }
    }

    public function offsetSet($index, $value) {
        parent::offsetSet($value->title, $value);
    }
}

$cartoons = new CartoonArray(array(new Cartoon('Tom and Jerry'), new Cartoon('Cheburashka')));
$cartoons[] = new Cartoon('Sesame street');

print $cartoons['Tom and Jerry']->title;
unset($cartoons['Tom and Jerry']);

foreach ($cartoons as $k => $v) {
    print $k."\n";
}
于 2012-11-21T14:11:08.523 に答える
0

反復を伴わない方法は考えられません。ただし、追加の変数を必要としない方法を考えることができます。

$cartoons = array(new Cartoon('Tom and Jerry'), new Cartoon('Cheburashka'));
foreach( $cartoons as $key => $cartoon )
{
    $cartoons[ $cartoon->title ] = $cartoon;
    unset( $cartoons[ $key ] );
}

var_dump( $cartoons );

ただし、メモのドキュメント:foreach

foreach は内部配列ポインターに依存しているため、ループ内で変更すると、予期しない動作が発生する可能性があります。

これが私の例にも当てはまるかどうかは完全にはわかりません。たぶん、他の誰かがここでチャイムを鳴らすことができます。

安全を期すために、反復の前に$lenの初期長で開始するため、おそらくこの代替方法がより適切です。$cartoons

$cartoons = array(new Cartoon('Tom and Jerry'), new Cartoon('Cheburashka'));
for( $i = 0, $len = count( $cartoons ); $i < $len; $i++ )
{
    $cartoon = $cartoons[ $i ];
    $cartoons[ $cartoon->title ] = $cartoon;
    unset( $cartoons[ $i ] );
}

var_dump( $cartoons );

ただし、この例では、イニシャル$cartoonsに から始まる「適切な」連番キーがあることを前提として0います。

于 2012-11-21T14:12:38.433 に答える