私は今、これに対する独自の解決策を考え出しました:
1.配列から特定の属性を抽出するための一般的な関数を作成しました
以下の関数は、連想配列または連想配列の配列から特定の属性のみを抽出します(最後は、Laravelで$ collection-> toArray()を実行したときに取得するものです)。
これは次のように使用できます。
$data = array_extract( $collection->toArray(), ['id','url'] );
私は次の関数を使用しています:
function array_is_assoc( $array )
{
return is_array( $array ) && array_diff_key( $array, array_keys(array_keys($array)) );
}
function array_extract( $array, $attributes )
{
$data = [];
if ( array_is_assoc( $array ) )
{
foreach ( $attributes as $attribute )
{
$data[ $attribute ] = $array[ $attribute ];
}
}
else
{
foreach ( $array as $key => $values )
{
$data[ $key ] = [];
foreach ( $attributes as $attribute )
{
$data[ $key ][ $attribute ] = $values[ $attribute ];
}
}
}
return $data;
}
このソリューションは、大規模なデータセットのコレクションをループする際のパフォーマンスへの影響に焦点を当てていません。
2.カスタムコレクションiLaravelを介して上記を実装します
$collection->extract('id','url');
任意のコレクションオブジェクトで簡単に実行できるようにしたいので、カスタムコレクションクラスを実装しました。
最初に、Eloquentモデルを拡張するが、異なるコレクションクラスを使用する一般的なモデルを作成しました。すべてのモデルは、このカスタムモデルを拡張する必要があり、Eloquentモデルを拡張する必要はありません。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Lib\Collection;
class Model extends EloquentModel
{
public function newCollection(array $models = [])
{
return new Collection( $models );
}
}
?>
次に、次のカスタムコレクションクラスを作成しました。
<?php
namespace Lib;
use Illuminate\Support\Collection as EloquentCollection;
class Collection extends EloquentCollection
{
public function extract()
{
$attributes = func_get_args();
return array_extract( $this->toArray(), $attributes );
}
}
?>
最後に、すべてのモデルは、代わりに次のようにカスタムモデルを拡張する必要があります。
<?php
namespace App\Models;
class Article extends Model
{
...
今からの機能はありません。上記の1は、$collection->extract()
メソッドを使用可能にするためにコレクションによって適切に使用されます。
Collection::implode()
。プロパティを取得して、コレクション内のすべてのオブジェクトから抽出できます。これはこの質問に正確に答えるものではありませんが、私が行ったように、Googleからここに来た他の人にとっては役立つかもしれません。laravel.com/docs/5.7/collections#method-implode